最近在项目当中遇到了浮点数计算有一些特殊情况会出现很多位小数,自己总结了一下,并封装了一个解决此问题的方法。
一、浮点数计算的几种特殊情况
0.1+0.2 = 0.30000000000000004
10.22*100 = 1022.0000000000001
2.4/0.8 = 2.9999999999999996
32.2*100 = 3220.0000000000005
32.2*1000 = 32200.000000000004
32.3*100 = 3229.9999999999995
32.3*1000 = 32299.999999999996
……
二、造成此现象的原因
一是:js 浮点数计算的 Bug;
二是:跟计算机最终转换成二进制计算有关系。
三、解决办法
在确定要保留几位(比如n位)小数的情况下,可以把计算结果乘以10的n次,再 Math.round() 结果,再除以10的n次。
eg: 计算价格一般是保留2位小数
(Math.round((price1 * count) * 100) / 100).toFixed(2)
注意:toFixed() 返回的是字符串
Math.pow(10, n) 可以表示 10 的 n 次方。
我封装了以下函数来解决:
- /**
- * @param number {number}
- * @param toFixed {number}
- * @returns {string}
- */
- formatJsCompute (number, toFixed) {
- let base = Math.pow(10, toFixed)
- return (Math.round(number * base) / base).toFixed(2)
- }