0.1.toString(2) // "0.0001100110011001100110011001100110011001100110011001101"
0.2.toString(2) // 0.001100110011001100110011001100110011001100110011001101
0.1 + 0.2 = 0.30000000000000004 // 15 个 0
在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了
Math.formatFloat = function (f, digit) {
// Math.pow(指数,幂指数)
var m = Math.pow(10, digit);
// Math.round() 四舍五入
return Math.round(f * m, 10) / m;
}
console.log(9.12 * 100); // 911.9999999999999
console.log(Math.formatFloat(9.12 * 100, 2)); // 9.12
可以看到,当十进制小数的二进制表示的有限数字超过 52 位时,在 JS 里是不能精确存储的,这时候就存在舍入误差(Round-off error)