diff --git a/build/index.iife.js b/build/index.iife.js index 19e4551..fee012f 100644 --- a/build/index.iife.js +++ b/build/index.iife.js @@ -1,129 +1,130 @@ var NP = (function (exports) { 'use strict'; -/** - * @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 = 12; } - return +parseFloat(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(num * Math.pow(10, dLen)) : 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, [times(num1, num2), others[0]].concat(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, [plus(num1, num2), others[0]].concat(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, [minus(num1, num2), others[0]].concat(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, [divide(num1, num2), others[0]].concat(others.slice(1))); - } - var num1Changed = float2Fixed(num1); - var num2Changed = float2Fixed(num2); - checkBoundary(num1Changed); - checkBoundary(num2Changed); - return times((num1Changed / num2Changed), 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; -} +/** + * @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 = 12; } + return +parseFloat(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(num * Math.pow(10, dLen)) : 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, [times(num1, num2), others[0]].concat(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, [plus(num1, num2), others[0]].concat(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, [minus(num1, num2), others[0]].concat(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, [divide(num1, num2), others[0]].concat(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 }; exports.strip = strip; diff --git a/build/index.js b/build/index.js index 283c508..f295d3f 100644 --- a/build/index.js +++ b/build/index.js @@ -2,129 +2,130 @@ Object.defineProperty(exports, '__esModule', { value: true }); -/** - * @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 = 12; } - return +parseFloat(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(num * Math.pow(10, dLen)) : 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, [times(num1, num2), others[0]].concat(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, [plus(num1, num2), others[0]].concat(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, [minus(num1, num2), others[0]].concat(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, [divide(num1, num2), others[0]].concat(others.slice(1))); - } - var num1Changed = float2Fixed(num1); - var num2Changed = float2Fixed(num2); - checkBoundary(num1Changed); - checkBoundary(num2Changed); - return times((num1Changed / num2Changed), 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; -} +/** + * @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 = 12; } + return +parseFloat(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(num * Math.pow(10, dLen)) : 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, [times(num1, num2), others[0]].concat(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, [plus(num1, num2), others[0]].concat(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, [minus(num1, num2), others[0]].concat(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, [divide(num1, num2), others[0]].concat(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 }; exports.strip = strip; diff --git a/build/index.js.map b/build/index.js.map index a8b2b37..c7a16e0 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/index.umd.js b/build/index.umd.js index 75a3603..c1d1016 100644 --- a/build/index.umd.js +++ b/build/index.umd.js @@ -4,129 +4,130 @@ (factory((global.NP = {}))); }(this, (function (exports) { 'use strict'; -/** - * @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 = 12; } - return +parseFloat(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(num * Math.pow(10, dLen)) : 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, [times(num1, num2), others[0]].concat(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, [plus(num1, num2), others[0]].concat(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, [minus(num1, num2), others[0]].concat(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, [divide(num1, num2), others[0]].concat(others.slice(1))); - } - var num1Changed = float2Fixed(num1); - var num2Changed = float2Fixed(num2); - checkBoundary(num1Changed); - checkBoundary(num2Changed); - return times((num1Changed / num2Changed), 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; -} +/** + * @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 = 12; } + return +parseFloat(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(num * Math.pow(10, dLen)) : 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, [times(num1, num2), others[0]].concat(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, [plus(num1, num2), others[0]].concat(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, [minus(num1, num2), others[0]].concat(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, [divide(num1, num2), others[0]].concat(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 }; exports.strip = strip; diff --git a/src/index.ts b/src/index.ts index 3c467ee..b9d39ab 100644 --- a/src/index.ts +++ b/src/index.ts @@ -96,7 +96,8 @@ function divide(num1: number, num2: number, ...others: number[]): number { const num2Changed = float2Fixed(num2); checkBoundary(num1Changed); checkBoundary(num2Changed); - return times((num1Changed / num2Changed), Math.pow(10, digitLength(num2) - digitLength(num1))); + // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正 + return times((num1Changed / num2Changed), strip(Math.pow(10, digitLength(num2) - digitLength(num1)))); } /**