calculate-asmd
Advanced tools
| (function (global, factory) { | ||
| typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | ||
| typeof define === 'function' && define.amd ? define(['exports'], factory) : | ||
| (global = global || self, factory(global.CalculateAsmd = {})); | ||
| }(this, function (exports) { 'use strict'; | ||
| /** | ||
| * [scaleNum 将一个number浮点数放大或缩小position个小数点位数] | ||
| * @param {number} number 要放缩的浮点数 | ||
| * @param {number} position 小数点移动位数 | ||
| * position大于0为放大,小于0为缩小,等于0不做缩放。 | ||
| * @return {number} 放缩后的数 | ||
| */ | ||
| var scaleNum = function scaleNum() { | ||
| var number = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; | ||
| var position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | ||
| var num = Number(number); | ||
| var posNum = Number(position); // 如果传入两个参数,Number转化后为NaN则直接返回NaN | ||
| if (isNaN(num) || isNaN(posNum)) { | ||
| return NaN; | ||
| } | ||
| if (num === 0 || posNum === 0) { | ||
| return num; | ||
| } | ||
| var absNum = num; | ||
| var s = 1; | ||
| if (num < 0) { | ||
| absNum = Math.abs(num); | ||
| s = -1; | ||
| } | ||
| var parts = absNum.toString().split('.'); | ||
| var intLen = parts[0].length; | ||
| var decimalLen = parts[1] ? parts[1].length : 0; | ||
| if (posNum > 0) { | ||
| // 放大 | ||
| var zeros = posNum - decimalLen; | ||
| while (zeros > 0) { | ||
| zeros -= 1; | ||
| parts.push(0); | ||
| } | ||
| } else { | ||
| // 缩小 | ||
| var _zeros = Math.abs(posNum) - intLen; | ||
| while (_zeros > 0) { | ||
| _zeros -= 1; | ||
| parts.unshift(0); | ||
| } | ||
| } | ||
| var idx = intLen + posNum; | ||
| parts = parts.join('').split(''); | ||
| parts.splice(idx > 0 ? idx : 0, 0, '.'); | ||
| if (s < 0) { | ||
| parts.unshift('-'); | ||
| } | ||
| return parseFloat(parts.join('')); | ||
| }; | ||
| /** | ||
| * [add 通过比较两个加数谁的小数位最大,将两数小数点右移为整数进行计算] | ||
| * @param {number} arg1 加数 | ||
| * @param {number} arg2 被加数 | ||
| * @return {number} 结果 | ||
| */ | ||
| var add = function add() { | ||
| var arg1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; | ||
| var arg2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | ||
| var param1 = Number(arg1); | ||
| var param2 = Number(arg2); | ||
| if (isNaN(param1) || isNaN(param2)) { | ||
| return NaN; | ||
| } | ||
| var r1 = 0; | ||
| var r2 = 0; | ||
| var scale = 0; | ||
| try { | ||
| r1 = param1.toString().split('.')[1].length; | ||
| } catch (e) { | ||
| r1 = 0; | ||
| } | ||
| try { | ||
| r2 = param2.toString().split('.')[1].length; | ||
| } catch (e) { | ||
| r2 = 0; | ||
| } | ||
| scale = Math.max(r1, r2); | ||
| var num1 = scaleNum(param1, scale); | ||
| var num2 = scaleNum(param2, scale); | ||
| var num = num1 + num2; | ||
| var result = scaleNum(num, -scale); | ||
| return result; | ||
| }; | ||
| /** | ||
| * [sub 通过比较两个加数谁的小数位最大,将两数小数点右移为整数进行计算] | ||
| * @param {number} arg1 减数 | ||
| * @param {number} arg2 被减数 | ||
| * @return {number} 结果 | ||
| */ | ||
| var sub = function sub() { | ||
| var arg1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; | ||
| var arg2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | ||
| var param1 = Number(arg1); | ||
| var param2 = Number(arg2); | ||
| if (isNaN(param1) || isNaN(param2)) { | ||
| return NaN; | ||
| } | ||
| var r1 = 0; | ||
| var r2 = 0; | ||
| var scale = 0; | ||
| try { | ||
| r1 = param1.toString().split('.')[1].length; | ||
| } catch (e) { | ||
| r1 = 0; | ||
| } | ||
| try { | ||
| r2 = param2.toString().split('.')[1].length; | ||
| } catch (e) { | ||
| r2 = 0; | ||
| } | ||
| scale = Math.max(r1, r2); | ||
| var num1 = scaleNum(param1, scale); | ||
| var num2 = scaleNum(param2, scale); | ||
| var num = num1 - num2; | ||
| var result = scaleNum(num, -scale); | ||
| return result; | ||
| }; | ||
| /** | ||
| * [mul 将两个浮点数参数replace掉小数点为整数计算,scale在这里进行累计小数位] | ||
| * @param {number} arg1 乘数 | ||
| * @param {number} arg2 被乘数 | ||
| * @return {number} 结果 | ||
| */ | ||
| var mul = function mul() { | ||
| var arg1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; | ||
| var arg2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | ||
| var param1 = Number(arg1); | ||
| var param2 = Number(arg2); | ||
| if (isNaN(param1) || isNaN(param2)) { | ||
| return NaN; | ||
| } | ||
| var num1 = Number(param1.toString().replace('.', '')); | ||
| var num2 = Number(param2.toString().replace('.', '')); | ||
| var scale = 0; | ||
| try { | ||
| scale += param1.toString().split('.')[1].length; | ||
| } catch (e) { | ||
| scale += 0; | ||
| } | ||
| try { | ||
| scale += param2.toString().split('.')[1].length; | ||
| } catch (e) { | ||
| scale += 0; | ||
| } | ||
| var num = num1 * num2; | ||
| var result = scaleNum(num, -scale); | ||
| return result; | ||
| }; | ||
| /** | ||
| * [div 将两个浮点数参数replace掉小数点为整数计算,scale是被除数与除数的移动位数差] | ||
| * @param {number} arg1 除数 | ||
| * @param {number} arg2 被除数 | ||
| * @return {number} 结果 | ||
| */ | ||
| var div = function div() { | ||
| var arg1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; | ||
| var arg2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | ||
| var param1 = Number(arg1); | ||
| var param2 = Number(arg2); | ||
| if (isNaN(param1) || isNaN(param2)) { | ||
| return NaN; | ||
| } | ||
| var num1 = Number(param1.toString().replace('.', '')); | ||
| var num2 = Number(param2.toString().replace('.', '')); | ||
| var left1 = 0; | ||
| var left2 = 0; | ||
| try { | ||
| left1 = Number(param1.toString().split('.')[1].length); | ||
| } catch (e) { | ||
| left1 = 0; | ||
| } | ||
| try { | ||
| left2 = Number(param2.toString().split('.')[1].length); | ||
| } catch (e) { | ||
| left2 = 0; | ||
| } | ||
| /** | ||
| * 当被除数100是整数没有移动小数位,那么left2为0,除数0.57在运算中转整数为57。 | ||
| * 在实际的运算中0.57除以100中的0.57是根据被除数来移动小数的。 | ||
| * 所以,0 - 2 = -2。 将运算结果缩小两位为实际小数点位置 | ||
| * | ||
| * 除数多拿了被除数的几口口粮,最后要还回去的。 | ||
| * | ||
| */ | ||
| var scale = left2 - left1; | ||
| var num = num1 / num2; | ||
| var result = scaleNum(num, scale); | ||
| return result; | ||
| }; | ||
| exports.add = add; | ||
| exports.div = div; | ||
| exports.mul = mul; | ||
| exports.scaleNum = scaleNum; | ||
| exports.sub = sub; | ||
| Object.defineProperty(exports, '__esModule', { value: true }); | ||
| })); |
| !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).CalculateAsmd={})}(this,function(t){"use strict";var e=function(){var t=+(arguments.length>0&&void 0!==arguments[0]?arguments[0]:0),e=+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0);if(isNaN(t)||isNaN(e))return NaN;if(0===t||0===e)return t;var a=t,r=1;0>t&&(a=Math.abs(t),r=-1);var i=(""+a).split("."),n=i[0].length;if(e>0)for(var l=e-(i[1]?i[1].length:0);l>0;)l-=1,i.push(0);else for(var s=Math.abs(e)-n;s>0;)s-=1,i.unshift(0);var h=n+e;return(i=i.join("").split("")).splice(h>0?h:0,0,"."),0>r&&i.unshift("-"),parseFloat(i.join(""))};t.add=function(){var t=+(arguments.length>0&&void 0!==arguments[0]?arguments[0]:0),a=+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0);if(isNaN(t)||isNaN(a))return NaN;var r,i=0,n=0;try{i=(""+t).split(".")[1].length}catch(t){i=0}try{n=(""+a).split(".")[1].length}catch(t){n=0}var l=e(t,r=Math.max(i,n)),s=e(a,r);return e(l+s,-r)},t.div=function(){var t=+(arguments.length>0&&void 0!==arguments[0]?arguments[0]:0),a=+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0);if(isNaN(t)||isNaN(a))return NaN;var r=+(""+t).replace(".",""),i=+(""+a).replace(".",""),n=0,l=0;try{n=+(""+t).split(".")[1].length}catch(t){n=0}try{l=+(""+a).split(".")[1].length}catch(t){l=0}return e(r/i,l-n)},t.mul=function(){var t=+(arguments.length>0&&void 0!==arguments[0]?arguments[0]:0),a=+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0);if(isNaN(t)||isNaN(a))return NaN;var r=+(""+t).replace(".",""),i=+(""+a).replace(".",""),n=0;try{n+=(""+t).split(".")[1].length}catch(t){n+=0}try{n+=(""+a).split(".")[1].length}catch(t){n+=0}return e(r*i,-n)},t.scaleNum=e,t.sub=function(){var t=+(arguments.length>0&&void 0!==arguments[0]?arguments[0]:0),a=+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0);if(isNaN(t)||isNaN(a))return NaN;var r,i=0,n=0;try{i=(""+t).split(".")[1].length}catch(t){i=0}try{n=(""+a).split(".")[1].length}catch(t){n=0}var l=e(t,r=Math.max(i,n)),s=e(a,r);return e(l-s,-r)},Object.defineProperty(t,"__esModule",{value:!0})}); |
+2
-1
| { | ||
| "name": "calculate-asmd", | ||
| "version": "2.3.3", | ||
| "version": "2.4.4", | ||
| "description": "The precise addition, subtraction, multiplication and division of JavaScript avoids the error of floating point calculation", | ||
@@ -18,2 +18,3 @@ "license": "MIT", | ||
| "jsnext:main": "dist/index.esm.js", | ||
| "unpkg": "dist/index.umd.js", | ||
| "typings": "typings/index.d.ts", | ||
@@ -20,0 +21,0 @@ "sideEffects": false, |
+42
-22
@@ -16,33 +16,48 @@ # calculate-asmd | ||
| <h3>yarn</h3> | ||
| `yarn add calculate-asmd` | ||
| or | ||
| <h3>npm</h3> | ||
| `npm install calculate-asmd --save` | ||
| <h3>umd</h3> | ||
| ```javascript | ||
| <script src="https://unpkg.com/calculate-asmd@2.4.4/dist/index.umd.js"></script> | ||
| OR | ||
| <script src="https://unpkg.com/calculate-asmd@2.4.4/dist/index.umd.min.js"></script> | ||
| ``` | ||
| > Tips: You can find the library on window.CalculateAsmd. | ||
| <h2>Usage</h2> | ||
| ``` | ||
| import { add, sub, mul, div } from 'calculate-asmd' | ||
| const addNum = add(0.2, 0.4); | ||
| console.log("add(0.2, 0.4): ", addNum); //add(0.2, 0.4): 0.6 | ||
| const addNegative = add(0.2, -0.4); | ||
| console.log("add(0.2, -0.4): ", addNegative); //add(0.2, -0.4): -0.2 | ||
| import { add, sub, mul, div } from 'calculate-asmd' | ||
| const subNum = sub(0.2, 0.4); | ||
| console.log("sub(0.2, 0.4): ", subNum); //sub(0.2, 0.4): -0.2 | ||
| const subNegative = sub(0.2, -0.4); | ||
| console.log("sub(0.2, -0.4): ", subNegative); //sub(0.2, -0.4): 0.6 | ||
| const addNum = add(0.2, 0.4); | ||
| console.log("add(0.2, 0.4): ", addNum); //add(0.2, 0.4): 0.6 | ||
| const addNegative = add(0.2, -0.4); | ||
| console.log("add(0.2, -0.4): ", addNegative); //add(0.2, -0.4): -0.2 | ||
| const mulNum = mul(0.57, 100); | ||
| console.log("mul(0.57, 100): ", mulNum); //mul(0.57, 100): 57 | ||
| const mulNegativ = mul(-0.57, 100); | ||
| console.log("mul(-0.57, 100): ", mulNegativ); //mul(-0.57, 100): -57 | ||
| const subNum = sub(0.2, 0.4); | ||
| console.log("sub(0.2, 0.4): ", subNum); //sub(0.2, 0.4): -0.2 | ||
| const subNegative = sub(0.2, -0.4); | ||
| console.log("sub(0.2, -0.4): ", subNegative); //sub(0.2, -0.4): 0.6 | ||
| const divNum = div(0.57, 100); | ||
| console.log("div(0.57, 100): ", divNum); //div(0.57, 100): 0.0057 | ||
| const divNegative = div(-0.57, 100); | ||
| console.log("div(-0.57, 100): ", divNegative); //div(-0.57, 100): -0.0057 | ||
| const mulNum = mul(0.57, 100); | ||
| console.log("mul(0.57, 100): ", mulNum); //mul(0.57, 100): 57 | ||
| const mulNegativ = mul(-0.57, 100); | ||
| console.log("mul(-0.57, 100): ", mulNegativ); //mul(-0.57, 100): -57 | ||
| const divNum = div(0.57, 100); | ||
| console.log("div(0.57, 100): ", divNum); //div(0.57, 100): 0.0057 | ||
| const divNegative = div(-0.57, 100); | ||
| console.log("div(-0.57, 100): ", divNegative); //div(-0.57, 100): -0.0057 | ||
| ``` | ||
@@ -65,8 +80,9 @@ | ||
| ``` | ||
| import { scaleNum } from 'calculate-asmd' | ||
| scaleNum(0.57, 2) // 57 | ||
| scaleNum(0.57, -2) // 0.0057 | ||
| scaleNum(0.57, 0) // 0.57 | ||
| import { scaleNum } from 'calculate-asmd' | ||
| scaleNum(0.57, 2) // 57 | ||
| scaleNum(0.57, -2) // 0.0057 | ||
| scaleNum(0.57, 0) // 0.57 | ||
| ``` | ||
@@ -87,1 +103,5 @@ | ||
| [license-url]: https://img.shields.io/npm/l/calculate-asmd.svg | ||
| ``` | ||
| ``` |
@@ -1,2 +0,2 @@ | ||
| export const scaleNum: (Num: number | string, position: number | string) => number | ||
| export const scaleNum: (number: number | string, position: number | string) => number | ||
| export const add: (arg1: number | string, arg2: number | string) => number | ||
@@ -3,0 +3,0 @@ export const sub: (arg1: number | string, arg2: number | string) => number |
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
26112
53.05%8
33.33%604
53.69%105
23.53%1
Infinity%