From 67b8cf62bf5f1f65708d4a5686719703c47624db Mon Sep 17 00:00:00 2001 From: zhiyan Date: Wed, 15 Jul 2020 18:52:06 +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 | 248 +++++++++++++++++---------------- 6 files changed, 430 insertions(+), 536 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..ffc585b 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1,18 +1,18 @@ -import test from 'ava'; -import NP from '../src/index'; +import test from "ava"; +import NP from "../src/index"; -test('NP.strip can eliminate rounding errors', (t) => { +test("NP.strip can eliminate rounding errors", (t) => { t.true(NP.strip(0.09999999999999998) === 0.1); t.true(NP.strip(1.0000000000000001) === 1); - t.true(NP.strip('0.09999999999999998') === 0.1); - t.true(NP.strip('1.0000000000000001') === 1); + t.true(NP.strip("0.09999999999999998") === 0.1); + t.true(NP.strip("1.0000000000000001") === 1); }); -test('NP.digitLength can do digitLength operation', (t) => { +test("NP.digitLength can do digitLength operation", (t) => { t.true(NP.digitLength(123.4567890123) === 10); t.true(NP.digitLength(1.23e-5) === 7); - t.true(NP.digitLength(1.23E-5) === 7); + t.true(NP.digitLength(1.23e-5) === 7); t.true(NP.digitLength(1.233467e-5) === 11); t.true(NP.digitLength(123.45e-5) === 7); t.true(NP.digitLength(1.23e-10) === 12); @@ -21,19 +21,19 @@ test('NP.digitLength can do digitLength operation', (t) => { t.true(NP.digitLength(1.12345e20) === 0); t.true(NP.digitLength(1.123e30) === 0); t.true(NP.digitLength(1.123e-100) === 103); - t.true(NP.digitLength('1.23e-5') === 7); - t.true(NP.digitLength('1.23E-5') === 7); - t.true(NP.digitLength('1.233467e-5') === 11); - t.true(NP.digitLength('123.45e-5') === 7); - t.true(NP.digitLength('1.23e-10') === 12); - t.true(NP.digitLength('1.23e1') === 1); - t.true(NP.digitLength('1e20') === 0); - t.true(NP.digitLength('1.12345e20') === 0); - t.true(NP.digitLength('1.123e30') === 0); - t.true(NP.digitLength('1.123e-100') === 103); + t.true(NP.digitLength("1.23e-5") === 7); + t.true(NP.digitLength("1.23E-5") === 7); + t.true(NP.digitLength("1.233467e-5") === 11); + t.true(NP.digitLength("123.45e-5") === 7); + t.true(NP.digitLength("1.23e-10") === 12); + t.true(NP.digitLength("1.23e1") === 1); + t.true(NP.digitLength("1e20") === 0); + t.true(NP.digitLength("1.12345e20") === 0); + t.true(NP.digitLength("1.123e30") === 0); + t.true(NP.digitLength("1.123e-100") === 103); }); -test('NP.float2Fixed can change float to fixed', (t) => { +test("NP.float2Fixed can change float to fixed", (t) => { t.true(NP.float2Fixed(1e-1) === 1); t.true(NP.float2Fixed(1e-6) === 1); t.true(NP.float2Fixed(1e-7) === 1); @@ -44,19 +44,19 @@ test('NP.float2Fixed can change float to fixed', (t) => { t.true(NP.float2Fixed(1.2345678912345e10) === 12345678912345); t.true(NP.float2Fixed(0.000000123456) === 123456); t.true(NP.float2Fixed(1.23456e-7) === 123456); - t.true(NP.float2Fixed('1e-1') === 1); - t.true(NP.float2Fixed('1e-6') === 1); - t.true(NP.float2Fixed('1e-7') === 1); - t.true(NP.float2Fixed('1e-13') === 1); - t.true(NP.float2Fixed('1.123e30') === 1.123e30); - t.true(NP.float2Fixed('1.6e-30') === 16); - t.true(NP.float2Fixed('1.234567e-13') === 1234567); - t.true(NP.float2Fixed('1.2345678912345e10') === 12345678912345); - t.true(NP.float2Fixed('0.000000123456') === 123456); - t.true(NP.float2Fixed('1.23456e-7') === 123456); + t.true(NP.float2Fixed("1e-1") === 1); + t.true(NP.float2Fixed("1e-6") === 1); + t.true(NP.float2Fixed("1e-7") === 1); + t.true(NP.float2Fixed("1e-13") === 1); + t.true(NP.float2Fixed("1.123e30") === 1.123e30); + t.true(NP.float2Fixed("1.6e-30") === 16); + t.true(NP.float2Fixed("1.234567e-13") === 1234567); + t.true(NP.float2Fixed("1.2345678912345e10") === 12345678912345); + t.true(NP.float2Fixed("0.000000123456") === 123456); + t.true(NP.float2Fixed("1.23456e-7") === 123456); }); -test('NP.plus can do plus operation', (t) => { +test("NP.plus can do plus operation", (t) => { t.true(NP.plus(0.1, 0.2) === 0.3); t.true(NP.plus(2.3, 2.4) === 4.7); t.true(NP.plus(-1.6, -1) === -2.6); @@ -67,22 +67,24 @@ test('NP.plus can do plus operation', (t) => { t.true(NP.plus(2.018, 0.001) === 2.019); t.true(NP.plus(1.3224e10, 1.3224e3) === 13224001322.4); t.true(NP.plus(1.6e-30, 1.6e-30) === 3.2e-30); - t.true(NP.plus('0.1', '0.2') === 0.3); - t.true(NP.plus('2.3', '2.4') === 4.7); - t.true(NP.plus('-1.6', '-1') === -2.6); - t.true(NP.plus('-2.0', '63') === 61); - t.true(NP.plus('-3', '7') === 4); - t.true(NP.plus('-221', '38') === -183); - t.true(NP.plus('-1', '0') === -1); - t.true(NP.plus('2.018', '0.001') === 2.019); - t.true(NP.plus('1.3224e10', '1.3224e3') === 13224001322.4); - t.true(NP.plus('1.6e-30', '1.6e-30') === 3.2e-30); + t.true(NP.plus("0.1", "0.2") === 0.3); + t.true(NP.plus("2.3", "2.4") === 4.7); + t.true(NP.plus("-1.6", "-1") === -2.6); + t.true(NP.plus("-2.0", "63") === 61); + t.true(NP.plus("-3", "7") === 4); + t.true(NP.plus("-221", "38") === -183); + t.true(NP.plus("-1", "0") === -1); + t.true(NP.plus("2.018", "0.001") === 2.019); + t.true(NP.plus("1.3224e10", "1.3224e3") === 13224001322.4); + t.true(NP.plus("1.6e-30", "1.6e-30") === 3.2e-30); 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("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) => { +test("NP.minus can do minus operation", (t) => { t.true(NP.minus(0.07, 0.01) === 0.06); t.true(NP.minus(0.7, 0.1) === 0.6); t.true(NP.minus(1.0, 0.9) === 0.1); @@ -91,37 +93,43 @@ test('NP.minus can do minus operation', (t) => { t.true(NP.minus(-1, 0) === -1); t.true(NP.minus(-1, -0) === -1); t.true(NP.minus(1, 22) === -21); - t.true(NP.minus(8893568.397103781249, -7.29674059550) === 8893575.693844376749); + t.true( + NP.minus(8893568.397103781249, -7.2967405955) === 8893575.693844376749 + ); t.true(NP.minus(105468873, 0) === 105468873); - t.true(NP.minus('0.07', '0.01') === 0.06); - t.true(NP.minus('0.7', '0.1') === 0.6); - t.true(NP.minus('1.0', '0.9') === 0.1); - t.true(NP.minus('1', '0') === 1); - t.true(NP.minus('1', '-0') === 1); - t.true(NP.minus('-1', '0') === -1); - t.true(NP.minus('-1', '-0') === -1); - t.true(NP.minus('1', '22') === -21); - t.true(NP.minus('8893568.397103781249', '-7.29674059550') === 8893575.693844376749); - t.true(NP.minus('105468873', '0') === 105468873); + t.true(NP.minus("0.07", "0.01") === 0.06); + t.true(NP.minus("0.7", "0.1") === 0.6); + t.true(NP.minus("1.0", "0.9") === 0.1); + t.true(NP.minus("1", "0") === 1); + t.true(NP.minus("1", "-0") === 1); + t.true(NP.minus("-1", "0") === -1); + t.true(NP.minus("-1", "-0") === -1); + t.true(NP.minus("1", "22") === -21); + t.true( + NP.minus("8893568.397103781249", "-7.29674059550") === 8893575.693844376749 + ); + t.true(NP.minus("105468873", "0") === 105468873); t.true(NP.minus(1.23e5, 10) === 122990); t.true(NP.minus(1.23e-5, 1.0023) === -1.0022877); t.true(NP.minus(1.3224e10, 21) === 13223999979); t.true(NP.minus(1.3224e10, 1.3224e3) === 13223998677.6); t.true(NP.minus(1.7e-30, 0.1e-30) === 1.6e-30); - t.true(NP.minus('1.23e5', '10') === 122990); - t.true(NP.minus('1.23e-5', '1.0023') === -1.0022877); - t.true(NP.minus('1.3224e10', '21') === 13223999979); - t.true(NP.minus('1.3224e10', '1.3224e3') === 13223998677.6); - t.true(NP.minus('1.7e-30', '0.1e-30') === 1.6e-30); + t.true(NP.minus("1.23e5", "10") === 122990); + t.true(NP.minus("1.23e-5", "1.0023") === -1.0022877); + t.true(NP.minus("1.3224e10", "21") === 13223999979); + t.true(NP.minus("1.3224e10", "1.3224e3") === 13223998677.6); + t.true(NP.minus("1.7e-30", "0.1e-30") === 1.6e-30); t.true(NP.minus(6, 3, 2) === 1); 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("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) => { +test("NP.times can do times operation", (t) => { t.true(NP.times(0.07, 100) === 7); t.true(NP.times(0.7, 0.1) === 0.07); t.true(NP.times(3, 0.3) === 0.9); @@ -133,45 +141,47 @@ test('NP.times can do times operation', (t) => { t.true(NP.times(1.22, -1.639344262295082) === -2); t.true(NP.times(2.5, -0.92) === -2.3); t.true(NP.times(-2.2, 0.6363636363636364) === -1.4); - t.true(NP.times('0.07', '100') === 7); - t.true(NP.times('0.7', '0.1') === 0.07); - t.true(NP.times('3', '0.3') === 0.9); - t.true(NP.times('118762317358.75', '1e-8') === 1187.6231735875); - t.true(NP.times('0.362', '100') === 36.2); - t.true(NP.times('1.1', '1.1') === 1.21); - t.true(NP.times('2.018', '1000') === 2018); - t.true(NP.times('5.2', '-3.8461538461538462') === -20); - t.true(NP.times('1.22', '-1.639344262295082') === -2); - t.true(NP.times('2.5', '-0.92') === -2.3); - t.true(NP.times('-2.2', '0.6363636363636364') === -1.4); + t.true(NP.times("0.07", "100") === 7); + t.true(NP.times("0.7", "0.1") === 0.07); + t.true(NP.times("3", "0.3") === 0.9); + t.true(NP.times("118762317358.75", "1e-8") === 1187.6231735875); + t.true(NP.times("0.362", "100") === 36.2); + t.true(NP.times("1.1", "1.1") === 1.21); + t.true(NP.times("2.018", "1000") === 2018); + t.true(NP.times("5.2", "-3.8461538461538462") === -20); + t.true(NP.times("1.22", "-1.639344262295082") === -2); + t.true(NP.times("2.5", "-0.92") === -2.3); + t.true(NP.times("-2.2", "0.6363636363636364") === -1.4); // t.true(NP.times(-3, 2.3333333333333335) === 7); // t.true(NP.times(-0.076, -92.10526315789471) === 7); t.true(NP.times(8.0, -0.3625) === -2.9); t.true(NP.times(6.6, 0.30303030303030304) === 2); t.true(NP.times(10.0, -0.8) === -8); t.true(NP.times(-1.1, -7.272727272727273) === 8); - t.true(NP.times('8.0', '-0.3625') === -2.9); - t.true(NP.times('6.6', '0.30303030303030304') === 2); - t.true(NP.times('10.0', '-0.8') === -8); - t.true(NP.times('-1.1', '-7.272727272727273') === 8); + t.true(NP.times("8.0", "-0.3625") === -2.9); + t.true(NP.times("6.6", "0.30303030303030304") === 2); + t.true(NP.times("10.0", "-0.8") === -8); + t.true(NP.times("-1.1", "-7.272727272727273") === 8); t.true(NP.times(-1.23e4, 20) === -246000); t.true(NP.times(1.7e-30, 1.5e20) === 2.55e-10); - t.true(NP.times('-1.23e4', '20') === -246000); - t.true(NP.times('1.7e-30', '1.5e20') === 2.55e-10); + t.true(NP.times("-1.23e4", "20") === -246000); + t.true(NP.times("1.7e-30", "1.5e20") === 2.55e-10); t.true(NP.times(2, 2, 3) === 12); t.true(NP.times(2, 2, 3, 0.1) === 1.2); - t.true(NP.times('2', '2', '3') === 12); - t.true(NP.times('2', '2', '3', '0.1') === 1.2); + t.true(NP.times("2", "2", "3") === 12); + t.true(NP.times("2", "2", "3", "0.1") === 1.2); 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('0.000000123456', '0.000000123456') === 1.5241383936e-14); - 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) => { +test("NP.divide can do divide operation", (t) => { t.true(NP.divide(1.21, 1.1) === 1.1); t.true(NP.divide(4750.49269435, 4) === 1187.6231735875); t.true(NP.divide(0.9, 3) === 0.3); @@ -186,37 +196,39 @@ test('NP.divide can do divide operation', (t) => { t.true(NP.divide(2, 6.6) === 0.30303030303030304); t.true(NP.divide(-8, 10.0) === -0.8); t.true(NP.divide(8, -1.1) === -7.272727272727273); - t.true(NP.divide('1.21', '1.1') === 1.1); - t.true(NP.divide('4750.49269435', '4') === 1187.6231735875); - t.true(NP.divide('0.9', '3') === 0.3); - t.true(NP.divide('36.2', '0.362') === 100); - t.true(NP.divide('-20', '5.2') === -3.8461538461538462); - t.true(NP.divide('-2', '1.22') === -1.639344262295082); - t.true(NP.divide('-2.3', '2.5') === -0.92); - t.true(NP.divide('-1.4', '-2.2') === 0.6363636363636364); - t.true(NP.divide('7', '-3') === -2.3333333333333335); - t.true(NP.divide('7', '-0.076') === -92.10526315789471); - t.true(NP.divide('-2.9', '8.0') === -0.3625); - t.true(NP.divide('2', '6.6') === 0.30303030303030304); - t.true(NP.divide('-8', '10.0') === -0.8); - t.true(NP.divide('8', '-1.1') === -7.272727272727273); + t.true(NP.divide("1.21", "1.1") === 1.1); + t.true(NP.divide("4750.49269435", "4") === 1187.6231735875); + t.true(NP.divide("0.9", "3") === 0.3); + t.true(NP.divide("36.2", "0.362") === 100); + t.true(NP.divide("-20", "5.2") === -3.8461538461538462); + t.true(NP.divide("-2", "1.22") === -1.639344262295082); + t.true(NP.divide("-2.3", "2.5") === -0.92); + t.true(NP.divide("-1.4", "-2.2") === 0.6363636363636364); + t.true(NP.divide("7", "-3") === -2.3333333333333335); + t.true(NP.divide("7", "-0.076") === -92.10526315789471); + t.true(NP.divide("-2.9", "8.0") === -0.3625); + t.true(NP.divide("2", "6.6") === 0.30303030303030304); + t.true(NP.divide("-8", "10.0") === -0.8); + t.true(NP.divide("8", "-1.1") === -7.272727272727273); t.true(NP.divide(-1.23e4, 20) === -615); t.true(NP.divide(2.55e-10, 1.7e-30) === 1.5e20); - t.true(NP.divide('-1.23e4', '20') === -615); - t.true(NP.divide('2.55e-10', '1.7e-30') === 1.5e20); + t.true(NP.divide("-1.23e4", "20") === -615); + t.true(NP.divide("2.55e-10", "1.7e-30") === 1.5e20); t.true(NP.divide(12, 3, 2) === 2); 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('12', '3', '2') === 2); - 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("12", "3", "2") === 2); + 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) => { +test("NP.round can do round operation", (t) => { t.true(NP.round(0, 1) === 0); t.true(NP.round(0, 0) === 0); t.true(NP.round(0.7875, 3) === 0.788); @@ -229,23 +241,23 @@ test('NP.round can do round operation', (t) => { t.true(NP.round(12345.105, 2) === 12345.11); t.true(NP.round(0.0005, 2) === 0); t.true(NP.round(0.0005, 3) === 0.001); - t.true(NP.round('0', 1) === 0); - t.true(NP.round('0', 0) === 0); - t.true(NP.round('0.7875', 3) === 0.788); - t.true(NP.round('0.105', 2) === 0.11); - t.true(NP.round('1', 1) === 1); - t.true(NP.round('0.1049999999', 2) === 0.1); - t.true(NP.round('0.105', 1) === 0.1); - t.true(NP.round('1.335', 2) === 1.34); - t.true(NP.round('1.35', 1) === 1.4); - t.true(NP.round('12345.105', 2) === 12345.11); - t.true(NP.round('0.0005', 2) === 0); - t.true(NP.round('0.0005', 3) === 0.001); + t.true(NP.round("0", 1) === 0); + t.true(NP.round("0", 0) === 0); + t.true(NP.round("0.7875", 3) === 0.788); + t.true(NP.round("0.105", 2) === 0.11); + t.true(NP.round("1", 1) === 1); + t.true(NP.round("0.1049999999", 2) === 0.1); + t.true(NP.round("0.105", 1) === 0.1); + t.true(NP.round("1.335", 2) === 1.34); + t.true(NP.round("1.35", 1) === 1.4); + t.true(NP.round("12345.105", 2) === 12345.11); + t.true(NP.round("0.0005", 2) === 0); + t.true(NP.round("0.0005", 3) === 0.001); t.true(NP.round(1.2345e3, 3) === 1234.5); t.true(NP.round(1.2344e3, 3) === 1234.4); t.true(NP.round(1e3, 1) === 1000); - t.true(NP.round('1.2345e3', 3) === 1234.5); - t.true(NP.round('1.2344e3', 3) === 1234.4); - t.true(NP.round('1e3', 1) === 1000); + t.true(NP.round("1.2345e3", 3) === 1234.5); + t.true(NP.round("1.2344e3", 3) === 1234.4); + t.true(NP.round("1e3", 1) === 1000); });