From 849a7178ec53641557cb69e6db6b7f6f10f752a2 Mon Sep 17 00:00:00 2001 From: zhiyan Date: Wed, 15 Jul 2020 18:58:15 +0800 Subject: [PATCH] fixes #30 --- build/index.es.js | 333 ++++++++++++++++++++------------------------ build/index.iife.js | 113 ++++++--------- build/index.js | 113 ++++++--------- build/index.umd.js | 113 ++++++--------- src/index.ts | 46 ++++-- test/index.test.ts | 8 ++ 6 files changed, 308 insertions(+), 418 deletions(-) diff --git a/build/index.es.js b/build/index.es.js index a88b8a1..53e30bf 100644 --- a/build/index.es.js +++ b/build/index.es.js @@ -1,187 +1,152 @@ -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - - - - - - - - - - - - - - - - - - - - - - - - - - - -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -} - -/** - * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。 - * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998 - */ -/** - * 把错误的数据转正 - * strip(0.09999999999999998)=0.1 - */ -function strip(num, precision) { - if (precision === void 0) { precision = 15; } - return +parseFloat(Number(num).toPrecision(precision)); -} -/** - * Return digits length of a number - * @param {*number} num Input number - */ -function digitLength(num) { - // Get digit length of e - var eSplit = num.toString().split(/[eE]/); - var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0); - return len > 0 ? len : 0; -} -/** - * 把小数转成整数,支持科学计数法。如果是小数则放大成整数 - * @param {*number} num 输入数 - */ -function float2Fixed(num) { - if (num.toString().indexOf('e') === -1) { - return Number(num.toString().replace('.', '')); - } - var dLen = digitLength(num); - return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num); -} -/** - * 检测数字是否越界,如果越界给出提示 - * @param {*number} num 输入数 - */ -function checkBoundary(num) { - if (_boundaryCheckingState) { - if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) { - console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate"); - } - } -} -/** - * 精确乘法 - */ -function times(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; - } - if (others.length > 0) { - return times.apply(void 0, __spreadArrays([times(num1, num2), others[0]], others.slice(1))); - } - var num1Changed = float2Fixed(num1); - var num2Changed = float2Fixed(num2); - var baseNum = digitLength(num1) + digitLength(num2); - var leftValue = num1Changed * num2Changed; - checkBoundary(leftValue); - return leftValue / Math.pow(10, baseNum); -} -/** - * 精确加法 - */ -function plus(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; - } - if (others.length > 0) { - return plus.apply(void 0, __spreadArrays([plus(num1, num2), others[0]], others.slice(1))); - } - var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); - return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; -} -/** - * 精确减法 - */ -function minus(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; - } - if (others.length > 0) { - return minus.apply(void 0, __spreadArrays([minus(num1, num2), others[0]], others.slice(1))); - } - var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); - return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; -} -/** - * 精确除法 - */ -function divide(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; - } - if (others.length > 0) { - return divide.apply(void 0, __spreadArrays([divide(num1, num2), others[0]], others.slice(1))); - } - var num1Changed = float2Fixed(num1); - var num2Changed = float2Fixed(num2); - checkBoundary(num1Changed); - checkBoundary(num2Changed); - // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正 - return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1)))); -} -/** - * 四舍五入 - */ -function round(num, ratio) { - var base = Math.pow(10, ratio); - return divide(Math.round(times(num, base)), base); -} -var _boundaryCheckingState = true; -/** - * 是否进行边界检查,默认开启 - * @param flag 标记开关,true 为开启,false 为关闭,默认为 true - */ -function enableBoundaryChecking(flag) { - if (flag === void 0) { flag = true; } - _boundaryCheckingState = flag; -} -var index = { - strip: strip, - plus: plus, - minus: minus, - times: times, - divide: divide, - round: round, - digitLength: digitLength, - float2Fixed: float2Fixed, - enableBoundaryChecking: enableBoundaryChecking, +/** + * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。 + * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998 + */ +/** + * 把错误的数据转正 + * strip(0.09999999999999998)=0.1 + */ +function strip(num, precision) { + if (precision === void 0) { precision = 15; } + return +parseFloat(Number(num).toPrecision(precision)); +} +/** + * Return digits length of a number + * @param {*number} num Input number + */ +function digitLength(num) { + // Get digit length of e + var eSplit = num.toString().split(/[eE]/); + var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0); + return len > 0 ? len : 0; +} +/** + * 把小数转成整数,支持科学计数法。如果是小数则放大成整数 + * @param {*number} num 输入数 + */ +function float2Fixed(num) { + if (num.toString().indexOf('e') === -1) { + return Number(num.toString().replace('.', '')); + } + var dLen = digitLength(num); + return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num); +} +/** + * 检测数字是否越界,如果越界给出提示 + * @param {*number} num 输入数 + */ +function checkBoundary(num) { + if (_boundaryCheckingState) { + if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) { + console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate"); + } + } +} +/** + * 迭代操作 + */ +function iteratorOperation(arr, operation) { + var num1 = arr[0], num2 = arr[1], others = arr.slice(2); + var res = operation(num1, num2); + others.forEach(function (num) { + res = operation(res, num); + }); + return res; +} +/** + * 精确乘法 + */ +function times() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; + } + if (nums.length > 2) { + return iteratorOperation(nums, times); + } + var num1 = nums[0], num2 = nums[1]; + var num1Changed = float2Fixed(num1); + var num2Changed = float2Fixed(num2); + var baseNum = digitLength(num1) + digitLength(num2); + var leftValue = num1Changed * num2Changed; + checkBoundary(leftValue); + return leftValue / Math.pow(10, baseNum); +} +/** + * 精确加法 + */ +function plus() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; + } + if (nums.length > 2) { + return iteratorOperation(nums, plus); + } + var num1 = nums[0], num2 = nums[1]; + var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); + return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; +} +/** + * 精确减法 + */ +function minus() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; + } + if (nums.length > 2) { + return iteratorOperation(nums, minus); + } + var num1 = nums[0], num2 = nums[1]; + var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); + return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; +} +/** + * 精确除法 + */ +function divide() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; + } + if (nums.length > 2) { + return iteratorOperation(nums, divide); + } + var num1 = nums[0], num2 = nums[1]; + var num1Changed = float2Fixed(num1); + var num2Changed = float2Fixed(num2); + checkBoundary(num1Changed); + checkBoundary(num2Changed); + // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正 + return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1)))); +} +/** + * 四舍五入 + */ +function round(num, ratio) { + var base = Math.pow(10, ratio); + return divide(Math.round(times(num, base)), base); +} +var _boundaryCheckingState = true; +/** + * 是否进行边界检查,默认开启 + * @param flag 标记开关,true 为开启,false 为关闭,默认为 true + */ +function enableBoundaryChecking(flag) { + if (flag === void 0) { flag = true; } + _boundaryCheckingState = flag; +} +var index = { + strip: strip, + plus: plus, + minus: minus, + times: times, + divide: divide, + round: round, + digitLength: digitLength, + float2Fixed: float2Fixed, + enableBoundaryChecking: enableBoundaryChecking, }; export { strip, plus, minus, times, divide, round, digitLength, float2Fixed, enableBoundaryChecking }; diff --git a/build/index.iife.js b/build/index.iife.js index 3b36f7e..e6234a0 100644 --- a/build/index.iife.js +++ b/build/index.iife.js @@ -1,56 +1,6 @@ var NP = (function (exports) { 'use strict'; -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - - - - - - - - - - - - - - - - - - - - - - - - - - - -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -} - /** * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。 * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998 @@ -95,17 +45,29 @@ function checkBoundary(num) { } } } +/** + * 迭代操作 + */ +function iteratorOperation(arr, operation) { + var num1 = arr[0], num2 = arr[1], others = arr.slice(2); + var res = operation(num1, num2); + others.forEach(function (num) { + res = operation(res, num); + }); + return res; +} /** * 精确乘法 */ -function times(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function times() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return times.apply(void 0, __spreadArrays([times(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, times); } + var num1 = nums[0], num2 = nums[1]; var num1Changed = float2Fixed(num1); var num2Changed = float2Fixed(num2); var baseNum = digitLength(num1) + digitLength(num2); @@ -116,42 +78,45 @@ function times(num1, num2) { /** * 精确加法 */ -function plus(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function plus() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return plus.apply(void 0, __spreadArrays([plus(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, plus); } + var num1 = nums[0], num2 = nums[1]; var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; } /** * 精确减法 */ -function minus(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function minus() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return minus.apply(void 0, __spreadArrays([minus(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, minus); } + var num1 = nums[0], num2 = nums[1]; var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; } /** * 精确除法 */ -function divide(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function divide() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return divide.apply(void 0, __spreadArrays([divide(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, divide); } + var num1 = nums[0], num2 = nums[1]; var num1Changed = float2Fixed(num1); var num2Changed = float2Fixed(num2); checkBoundary(num1Changed); diff --git a/build/index.js b/build/index.js index 18efab8..77ac829 100644 --- a/build/index.js +++ b/build/index.js @@ -2,56 +2,6 @@ Object.defineProperty(exports, '__esModule', { value: true }); -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - - - - - - - - - - - - - - - - - - - - - - - - - - - -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -} - /** * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。 * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998 @@ -96,17 +46,29 @@ function checkBoundary(num) { } } } +/** + * 迭代操作 + */ +function iteratorOperation(arr, operation) { + var num1 = arr[0], num2 = arr[1], others = arr.slice(2); + var res = operation(num1, num2); + others.forEach(function (num) { + res = operation(res, num); + }); + return res; +} /** * 精确乘法 */ -function times(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function times() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return times.apply(void 0, __spreadArrays([times(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, times); } + var num1 = nums[0], num2 = nums[1]; var num1Changed = float2Fixed(num1); var num2Changed = float2Fixed(num2); var baseNum = digitLength(num1) + digitLength(num2); @@ -117,42 +79,45 @@ function times(num1, num2) { /** * 精确加法 */ -function plus(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function plus() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return plus.apply(void 0, __spreadArrays([plus(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, plus); } + var num1 = nums[0], num2 = nums[1]; var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; } /** * 精确减法 */ -function minus(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function minus() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return minus.apply(void 0, __spreadArrays([minus(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, minus); } + var num1 = nums[0], num2 = nums[1]; var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; } /** * 精确除法 */ -function divide(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function divide() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return divide.apply(void 0, __spreadArrays([divide(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, divide); } + var num1 = nums[0], num2 = nums[1]; var num1Changed = float2Fixed(num1); var num2Changed = float2Fixed(num2); checkBoundary(num1Changed); diff --git a/build/index.umd.js b/build/index.umd.js index 52d6cba..7d14c1d 100644 --- a/build/index.umd.js +++ b/build/index.umd.js @@ -4,56 +4,6 @@ (factory((global.NP = {}))); }(this, (function (exports) { 'use strict'; -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - - - - - - - - - - - - - - - - - - - - - - - - - - - -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -} - /** * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。 * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998 @@ -98,17 +48,29 @@ function checkBoundary(num) { } } } +/** + * 迭代操作 + */ +function iteratorOperation(arr, operation) { + var num1 = arr[0], num2 = arr[1], others = arr.slice(2); + var res = operation(num1, num2); + others.forEach(function (num) { + res = operation(res, num); + }); + return res; +} /** * 精确乘法 */ -function times(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function times() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return times.apply(void 0, __spreadArrays([times(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, times); } + var num1 = nums[0], num2 = nums[1]; var num1Changed = float2Fixed(num1); var num2Changed = float2Fixed(num2); var baseNum = digitLength(num1) + digitLength(num2); @@ -119,42 +81,45 @@ function times(num1, num2) { /** * 精确加法 */ -function plus(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function plus() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return plus.apply(void 0, __spreadArrays([plus(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, plus); } + var num1 = nums[0], num2 = nums[1]; var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; } /** * 精确减法 */ -function minus(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function minus() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return minus.apply(void 0, __spreadArrays([minus(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, minus); } + var num1 = nums[0], num2 = nums[1]; var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; } /** * 精确除法 */ -function divide(num1, num2) { - var others = []; - for (var _i = 2; _i < arguments.length; _i++) { - others[_i - 2] = arguments[_i]; +function divide() { + var nums = []; + for (var _i = 0; _i < arguments.length; _i++) { + nums[_i] = arguments[_i]; } - if (others.length > 0) { - return divide.apply(void 0, __spreadArrays([divide(num1, num2), others[0]], others.slice(1))); + if (nums.length > 2) { + return iteratorOperation(nums, divide); } + var num1 = nums[0], num2 = nums[1]; var num1Changed = float2Fixed(num1); var num2Changed = float2Fixed(num2); checkBoundary(num1Changed); diff --git a/src/index.ts b/src/index.ts index 4e5f509..93c969e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,13 +47,29 @@ function checkBoundary(num: number) { } } +/** + * 迭代操作 + */ +function iteratorOperation(arr: numType[], operation: (...args: numType[]) => number): number { + const [num1, num2, ...others] = arr; + let res = operation(num1, num2); + + others.forEach((num) => { + res = operation(res, num); + }); + + return res; +} + /** * 精确乘法 */ -function times(num1: numType, num2: numType, ...others: numType[]): number { - if (others.length > 0) { - return times(times(num1, num2), others[0], ...others.slice(1)); +function times(...nums: numType[]): number { + if (nums.length > 2) { + return iteratorOperation(nums, times); } + + const [num1, num2] = nums; const num1Changed = float2Fixed(num1); const num2Changed = float2Fixed(num2); const baseNum = digitLength(num1) + digitLength(num2); @@ -67,10 +83,12 @@ function times(num1: numType, num2: numType, ...others: numType[]): number { /** * 精确加法 */ -function plus(num1: numType, num2: numType, ...others: numType[]): number { - if (others.length > 0) { - return plus(plus(num1, num2), others[0], ...others.slice(1)); +function plus(...nums: numType[]): number { + if (nums.length > 2) { + return iteratorOperation(nums, plus); } + + const [num1, num2] = nums; const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; } @@ -78,10 +96,12 @@ function plus(num1: numType, num2: numType, ...others: numType[]): number { /** * 精确减法 */ -function minus(num1: numType, num2: numType, ...others: numType[]): number { - if (others.length > 0) { - return minus(minus(num1, num2), others[0], ...others.slice(1)); +function minus(...nums: numType[]): number { + if (nums.length > 2) { + return iteratorOperation(nums, minus); } + + const [num1, num2] = nums; const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; } @@ -89,10 +109,12 @@ function minus(num1: numType, num2: numType, ...others: numType[]): number { /** * 精确除法 */ -function divide(num1: numType, num2: numType, ...others: numType[]): number { - if (others.length > 0) { - return divide(divide(num1, num2), others[0], ...others.slice(1)); +function divide(...nums: numType[]): number { + if (nums.length > 2) { + return iteratorOperation(nums, divide); } + + const [num1, num2] = nums; const num1Changed = float2Fixed(num1); const num2Changed = float2Fixed(num2); checkBoundary(num1Changed); diff --git a/test/index.test.ts b/test/index.test.ts index 197daf7..276878f 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -80,6 +80,8 @@ test('NP.plus can do plus operation', (t) => { t.true(NP.plus(0.1, 0.2, 0.3) === 0.6); t.true(NP.plus('0.1', '0.2', '0.3') === 0.6); + + t.true(NP.plus(...new Array(500).fill(1)) === 500); }); test('NP.minus can do minus operation', (t) => { @@ -119,6 +121,8 @@ test('NP.minus can do minus operation', (t) => { t.true(NP.minus(6, 3, 2, 1, 2, 3) === -5); t.true(NP.minus('6', '3', '2') === 1); t.true(NP.minus('6', '3', '2', '1', '2', '3') === -5); + + t.true(NP.minus(500, ...new Array(500).fill(1)) === 0); }); test('NP.times can do times operation', (t) => { @@ -169,6 +173,8 @@ test('NP.times can do times operation', (t) => { t.true(NP.times(1.23456e-7, 1.23456e-7) === 1.5241383936e-14); t.true(NP.times('0.000000123456', '0.000000123456') === 1.5241383936e-14); t.true(NP.times('1.23456e-7', '1.23456e-7') === 1.5241383936e-14); + + t.true(NP.times(...new Array(500).fill(1)) === 1); }); test('NP.divide can do divide operation', (t) => { @@ -214,6 +220,8 @@ test('NP.divide can do divide operation', (t) => { t.true(NP.divide('33.3333', '100') === 0.333333); t.true(NP.divide('83.42894732749', '100') === 0.8342894732749); t.true(NP.divide('1', '3') === 0.3333333333333333); + + t.true(NP.divide(...new Array(500).fill(1)) === 1); }); test('NP.round can do round operation', (t) => {