js精度缺失是js计算中必须考虑到的一个问题,也是一道经典的面试题
console.log(0.1+0.2);
//0.30000000000000004
出现这种问题倒是也正常,js中有且只有number类型,并没有其他编程语言JAVA或者C的int类型。
话不多说直接上封装好的函数
function operateArray(operation, numbers) {
if (numbers.length === 0) {
throw new Error('数组不能为空');
}
let result = numbers[0];
for (let i = 1; i < numbers.length; i++) {
switch (operation) {
case 'add':
result = add(result, numbers[i]);
break;
case 'subtract':
result = subtract(result, numbers[i]);
break;
case 'multiply':
result = multiply(result, numbers[i]);
break;
case 'divide':
result = divide(result, numbers[i]);
break;
default:
throw new Error('不支持的操作');
}
}
return result;
}
//加
function add(a, b) {
const precision = Math.max(getPrecision(a), getPrecision(b));
const multiplier = Math.pow(10, precision);
return (a * multiplier + b * multiplier) / multiplier;
}
//减
function subtract(a, b) {
return add(a, -b);
}
//乘
function multiply(a, b) {
const precision = getPrecision(a) + getPrecision(b);
const multiplier = Math.pow(10, precision);
return (a * multiplier * (b * multiplier)) / (multiplier * multiplier);
}
//除
function divide(a, b) {
const precision = getPrecision(b) - getPrecision(a);
const multiplier = Math.pow(10, precision);
return (a * multiplier) / (b * multiplier);
}
function getPrecision(num) {
const decimalPart = String(num).split('.')[1];
return decimalPart ? decimalPart.length : 0;
}
如何使用?
import {operateArray} from "@/utils/index";
//传两个参,一个是计算方式,加减乘除,另一个要是计算的两个值
const value=operateArray('multiply',['值1','值2']);
这可以解决简单的计算部分只有一种计算符的使用场景
然而,我要是计算中有加减乘除咋整呢?
在精度需求不高的情况下,我们将最终的计算结果乘以100之后四舍五入后除以100也可以初步满足。如需再高精度,可以借助Decimal.js 或 BigNumber.js等第三方数字库来进行高精度计算。