Javascript中中toFixed计算错误计算错误(依赖银行家舍入法的缺陷依赖银行家舍入法的缺陷)解决解决
方法方法
前言前言
在公司项目中涉及到一个有大量浮点数价格计算的模块,从而引发了我一系列的思考:
计算机二进制环境下浮点数的计算精度缺失问题;
console.log(.1+.2);
0.30000000000000004
为了解决上述问题,使用了toFixed方法却出现了浮点数小数位以5结尾的四舍五入错误问题;
var num = 0.045;
console.log(num.toFixed(2));
0.04
以此为起点,引发了我关于toFixed的一系列探索,终于找到了一些有用的信息,toFixed使用的计算规则是:
银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。
简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。
正文正文
下面我们就来证实这个所谓的银行家舍入法,证实分为三种情况,分别以4、5、6为舍入位对toFixed的证实(以chrome为例):
以以4为舍入位:为舍入位:
var num = 0.004;
console.log(num.toFixed(2));
0.00
var num = 0.014;
console.log(num.toFixed(2));
0.01
var num = 0.094;
console.log(num.toFixed(2));
0.09
在4结尾这种情况下toFixed表现的还算不错,并没有错误的问题。
以以6为舍入位:为舍入位:
var num = 0.006;
console.log(num.toFixed(2));
0.01
var num = 0.016;
console.log(num.toFixed(2));
0.02
var num = 0.096;
console.log(num.toFixed(2));
0.10
以6结尾这种情况下toFixed表现的也不错,并没有错误的问题。
以以5为舍入位:为舍入位:
5后非零:
var num = 0.0051;
console.log(num.toFixed(2));
0.01
var num = 0.0052;
console.log(num.toFixed(2));
0.01
var num = 0.0059;
console.log(num.toFixed(2));
0.01
评论0