tools-for-js
Version:
基于babel构建的JavaScript前端工具库
135 lines (127 loc) • 3.56 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.summation = exports.exactAdd = exports.countNumber = void 0;
/**
* @description: 精确加法:
* js的加法结果会有丢失精度的情况,例如两个浮点数相加的时候
* @author: 琴时
* @param {Number|String} arg1
* @param {Number|String} arg2
* @return {Number}
*/
var exactAdd = exports.exactAdd = function exactAdd(arg1, arg2) {
if (isNaN(arg1)) arg1 = 0;
if (isNaN(arg2)) arg2 = 0;
arg1 = Number(arg1);
arg2 = Number(arg2);
var r1, r2, m, c;
try {
r1 = arg1.toString().split('.')[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split('.')[1].length;
} catch (e) {
r2 = 0;
}
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2));
if (c > 0) {
var cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace('.', ''));
arg2 = Number(arg2.toString().replace('.', '')) * cm;
} else {
arg1 = Number(arg1.toString().replace('.', '')) * cm;
arg2 = Number(arg2.toString().replace('.', ''));
}
} else {
arg1 = Number(arg1.toString().replace('.', ''));
arg2 = Number(arg2.toString().replace('.', ''));
}
return (arg1 + arg2) / m;
};
/*******
* @description: 计算数组元素的和
* @author: 琴时
* @param {Array} list
* @return {Number}
*/
var summation = exports.summation = function summation(list) {
var sum = 0;
if (list && list.length > 0) {
sum = list.reduce(function (n, m) {
return exactAdd(n, m);
});
}
return sum;
};
/*******
* @description: 计算两个参数
* @param {Number|String} arg1
* @param {Number|String} arg2
* @param {String} type [计算类型:sum-加,subtract-减,multiply-乘,divide-除]
* @return {Number}
*/
var countNumber = exports.countNumber = function countNumber(arg1, arg2) {
var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'sum';
if (arg1 === undefined || arg2 === undefined) {
console.log('参数格式不正确');
return NaN;
}
if (isNaN(arg1)) arg1 = 0;
if (isNaN(arg2)) arg2 = 0;
// 转字符串类型
arg1 = arg1.toString();
arg2 = arg2.toString();
// 获取小数点位置
var index1 = arg1.indexOf('.');
var index2 = arg2.indexOf('.');
// 获取小数点位数
var ws1 = 0;
var ws2 = 0;
if (index1 !== -1) {
ws1 = arg1.split('.')[1].length;
}
if (index2 !== -1) {
ws2 = arg2.split('.')[1].length;
}
var bigger = ws1 > ws2 ? ws1 : ws2; //位数较大值
var small = ws1 < ws2 ? ws1 : ws2; //位数较小值
var zeroCount = bigger - small; //位数差
// 去除小数点
arg1 = arg1.replace('.', '');
arg2 = arg2.replace('.', '');
// 位数差额补0
if (ws1 === small) {
for (var i = 0; i < zeroCount; i++) {
arg1 += '0';
}
} else {
for (var _i = 0; _i < zeroCount; _i++) {
arg2 += '0';
}
}
var result = 0; //结果
var multiple = 1; //倍数
for (var _i2 = 0; _i2 < bigger; _i2++) {
multiple = multiple * 10;
}
// 计算结果
if (type === 'sum') {
result = parseInt(arg1) + parseInt(arg2);
result = result / multiple;
} else if (type === 'subtract') {
result = parseInt(arg1) - parseInt(arg2);
result = result / multiple;
} else if (type === 'multiply') {
result = parseInt(arg1) * parseInt(arg2);
result = result / multiple / multiple;
} else if (type === 'divide') {
result = parseInt(arg1) / parseInt(arg2);
}
return result;
};
;