标签
note
字数
327 字
阅读时间
2 分钟
常见例子
txt
// 加法
0.1 + 0.2 = 0.30000000000000004
0.1 + 0.7 = 0.7999999999999999
0.2 + 0.4 = 0.6000000000000001
// 减法
0.3 - 0.2 = 0.09999999999999998
1.5 - 1.2 = 0.30000000000000004
// 乘法
0.8 * 3 = 2.4000000000000004
19.9 * 100 = 1989.9999999999998
// 除法
0.3 / 0.1 = 2.9999999999999996
0.69 / 10 = 0.06899999999999999
// 比较
0.1 + 0.2 === 0.3 // false
(0.3 - 0.2) === (0.2 - 0.1) // false导致原因
JavaScript 内部只有一种数字类型 Number,也就是说,JavaScript 语言的底层根本没有整数,所有数字都是以 IEEE-754 标准格式 64 位浮点数形式储存,1 与 1.0 是相同的。
因为有些小数以二进制表示位数是无穷的。JavaScript 会把超出 53 位之后的二进制舍弃,所以涉及小数的比较和运算要特别小心。
解决办法
1. 引用类库
2. 倍数放大
在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型 (最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了
js
0.1 + 0.2 ——> (0.1 * 10 + 0.2 * 10) / 10 // 0.3
0.8 * 3 ——> ( 0.8 * 100 * 3) / 100 //2.4