前端开发中,不可避免的会用到两个或者多个数据相加或相减的情况,而数字相加或相减,在js中,往往会出现精度丢失的情况。例如:
我们希望0.1 + 0.2
的数值为0.3,但实际上在控制台上输出的却是 0.30000000000000004
,这种情况在开发中肯定是要避免的,尤其是在涉及金额计算时,精度丢失就意味着bug的出现。
于是,封装了一个方法,用于解决js中N个数据相加或相减导致的精度丢失,目前该方法只适用于相加或相减,没有封装相乘或相除,如果需要解决相乘相除精度丢失,可以先进行乘除后在使用该方法进行 加 0 或 减 0
// 金额求和(相加/相减)
export const countSum: (arr: number[]) => number = (arr) => {
if (!arr.length) return 0;
arr = arr.map((v: number) => {
if (v && !Number.isNaN(Number(v))) return Math.round(v * 100);
return 0;
});
const result = arr.reduce((prev: number, curr: number) => {
return prev + curr
}, 0);
return result / 100;
};
使用形式:
- 相加:countSum( [ a, b, c ] )
- 相减:countSum( [ a, -b, -c ] )
注意:
- countSum方法中传入的值必须要是数字,使用该方法前,如果是字符串类型,需要将其转化,最简单的形式是在前面加个
+
- 如果是金额形式的数字字符串,则很可能包含逗号,在使用该方法前,需要去除其中的逗号,在将其转化成数字,
去除数字字符串中的逗号的方法,可以参考我上一篇博客的 get_money_num 方法