最近在项目上就有遇到由于js精度问题导致的浮点数的加减乘除结果不正确的问题。如下:
0.1 + 0.2
=> 0.30000000000000004
6.8 -0.9
=> 5.8999999999999995
7 * 0.8
=> 5.6000000000000005
5.6 / 0.8
=> 6.999999999999999
其实这是因为计算机内部计算,都是使用2进制数,而当js将我们使用的10进制转化为2进制数时,由于其遵循IEEE 754的国际标准,无法精确表示这种包含小数点的数据,因此JS将浮点数转换成了用二进制表示的最接近的近似值,这步操作就是导致误差的原因。
解决方案是:定一个函数对计算结果进行转换和处理:通过将浮点数转换成整数进行计算,然后再将整数的小数点位调整,转回正确的浮点数结果。
Math.formatFloat = function (f, digit) {
var m = Math.pow(10, digit);
return Math.round(f * m, 10) / m;
}
Math.formatFloat((0.1 + 0.2), 1)
=> 0.3
Math.formatFloat((6.8 -0.9), 1)
=> 5.9
Math.formatFloat((7 * 0.8), 1)
=> 5.6
Math.formatFloat((5.6 / 0.8), 1)
=> 7
另外要注明的是:
浮点数运算精度丢失问题并不是js独有的!
只是诸如 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题
参考链接: