前几天测试提出来一个bug,部分数字四舍五入不对。比如1.555,4.555,5.555,6.555,7.555,8.555,9.555四舍五入进位有误。
我在前端使用的是.toFixed()方法来保留两位小数,问题出在.toFixed()方法精确小数时的算法使用的是“银行家舍入法”,即4舍6入,当时我就想,wtf😒😒😒,啥时候出来的这么个舍入法。
银行家舍入法是由IEEE 754标准规定的浮点数取整算法(哦)
银行家舍入法的原则是:
四舍六入五考虑,五后非零就进一,
五后为零看奇偶,五前为偶应舍去,五前为奇要进一
所以1.555.toFixed(2) = 1.55 ...
解决这个问题的方法,使用Math的round()函数
//保留两位小数
round(num) {
if (isNaN(num)) return 0.00;
return ( Math.round(num * 100) / 100).toFixed(2);//这里的.toFixed()方法作用仅是保留两位小数
}
这种算法应该更适合银行里的业务行为吧,一分一厘也要算清楚。
感觉收款时用四舍五入比较好,付款时用银行家舍入好,😂😂😂
vans.png