这阵在做财务相关的项目,有些金额都无限小数,这就需要四舍五入保留到分。之前一直用**toFixed(2),简单测试也没有发现什么问题。等到正式上线就有人反应有的账差个一两分。虽然钱不多,但做账就是要准确。经过对程序逐步分析,最后发现误差就是出现在这个toFixed()**,JS
自带的方法上。最后经过上网搜索找到了解决方法。据说问题是出现在四舍六入五凑偶(4以下舍去,6以上进位,5只有前面一位是偶数的时候才进位,奇数不进位)。所以要重写 Number.prototype.toFixed 方法解决四舍五入不准确的问题。

  原文和代码出自js重写toFixed方法(兼容负数)Script,版权归原作者所有。下面是重写的代码。在调用toFixed()前,使用这个代码覆盖JS自带toFixed()方法即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Number.prototype.toFixed = function(s) {
var that = this,changenum,index;
if(this < 0){
that = -that;
}
changenum = (parseInt(that * Math.pow(10, s) + 0.5) / Math.pow(10, s)).toString();
index = changenum.indexOf(".");
if (index < 0 && s > 0) {
changenum = changenum + ".";
for (var i = 0; i < s; i++) {
changenum = changenum + "0";
}
} else {
index = changenum.length - index;
for (var i = 0; i < (s - index) + 1; i++) {
changenum = changenum + "0";
}
}
if(this<0){
return -changenum;
}else{
return changenum;
}
}