工作中遇到金額需要保留兩位小數的需求,單價1.265,數量為1,正常來講金額應為1.27,用了toFixd()方法后結果為1.26。
最終找到問題所在:1.265 - 1.26 = 0.004999999999999893;
為什么會這樣?
由於1.265不是精確表示的,而1.26是可以精確表示的,所以1.265就可以得到0.05存儲的值。可以看到確實是比0.05小。
按照源碼的判斷,如果剩下的尾數第1位不是1就不進位,由於剩下的尾數第1位是0,所以不進位,因此就導致了(1.265).toFixed(2)輸入結果是1.26
根本原因在於1.265的存儲要比實際存儲小一點,導致0.05的第1位尾數不是1,所以就被舍掉了。
解決方案:
if (!Number.prototype._toFixed) {
Number.prototype._toFixed = Number.prototype.toFixed;
}
Number.prototype.toFixed = function(n) {
return (this + 1e-14)._toFixed(n);
};
之后就正常了
我只是答案的搬運工,查看完整答案請移步 https://juejin.im/post/5a11a9fef265da43284073b4 謝謝~