let n1 = 0.1,
n2 = 0.2;
console.log(n1 + n2 === 0.3); // false -> 0.1 + 0.2 = 0.30000000000000004
(n1 + n2).toFixed(2); // 注意,toFixed为四舍五入
toFixed(num)
:方法可把 Number 四舍五入为指定小数位数的数字。
0.0001100110011001100...
(1100 循环),0.2 的二进制是:0.00110011001100...
(1100 循环),这两个数的二进制都是无限循环的数。Number
,它的实现遵循 IEEE 754
标准,使用 64 位固定长度来表示,也就是标准的 double 双精度浮点数
。在二进制科学表示法中,双精度浮点数的小数部分最多只能保留 52
位,再加上前面的 1
,其实就是保留 53
位有效数字,剩余的需要舍去,遵从“0 舍 1 入
”的原则。0.30000000000000004
。0.00011001100110011001100110011001100110011001100110011001 10011...
(1.1001100110011001100110011001100110011001100110011001 * 2) ^ -4;
1001100110011001100110011001100110011001100110011001;
-1022~1013
。1111111011
.0 1111111011 1001100110011001100110011001100110011001100110011001
Number.EPSILON
属性,而它的值就是 2-52,只要判断0.1+0.2-0.3
是否小于Number.EPSILON
,如果小于,就可以判断为 0.1 + 0.2 === 0.3。function numberepsilon(arg1, arg2) {
return Math.abs(arg1 - arg2) < Number.EPSILON;
}
console.log(numberepsilon(0.1 + 0.2, 0.3)); // true
•问题标注 Q:(question)
•答案标注 R:(result)
•注意事项标准:A:(attention matters)
•详情描述标注:D:(detail info)
•总结标注:S:(summary)
•分析标注:Ana:(analysis)
•提示标注:T:(tips)