在JavaScript里,0.1+0.2并不等于0.3。
为什么呢?
知识点:
- 在JavaScript中,浮点型数据在计算机中是通过64位的二进制存储
0.1与0.2的计算过程
小数本身乘以2,取整数位作为二进制表示位,然后取小数位重新参与计算,循环往复,直至小数乘以2的结果为0。
算法:
0.1*2=0.2 ----------- 取出整数部分0
0.2*2=0.4 ----------- 取出整数部分0
0.4*2=0.8 ----------- 取出整数部分0
0.8*2=1.6 ----------- 取出整数部分1
0.6*2=1.2 ----------- 取出整数部分1
0.2*2=0.4 ----------- 取出整数部分0
0.4*2=0.8 ----------- 取出整数部分0
0.8*2=1.6 ----------- 取出整数部分1
0.6*2=1.2 ----------- 取出整数部分1
我们可以发现在无限循环
0.1的二进制结果 0.0 0011 0011 0011 ..... "0011的无限循环"
0.2的二进制结果 0.0011 0011 0011 0011 .... "0011的无限循环"
取52位进行计算
0.1 = 0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001
0.2 = 0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011
计算的结果是: 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 ...也是无限循环
将二进制转换为十进制:
浮点型数据存储转换为十进制的话 只会取前17位
0.300000000000000044408920958 .... = 0.30000000000000004(四舍五入)
所以0.1+0.2的结果是等于0.30000000000000004
得出结果之后,我们去JS里试试 电脑的运算是怎么样的:
if(0.1+0.2 == 0.30000000000000004)
{
console.log("你算对了");
}
可以看出控制台弹出了 "你算对了"
所以 0.1+0.2 !== 0.3 ,0.1+0.2 == 0.30000000000000004
0.1+0.2 !== 0.3 的解决办法:
toFixed() 方法:toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
NumberObject.toFixed(num)
| 参数 | 描述 |
|---|---|
| num | 必需。规定小数的位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替。 |
var abc;
var bbc
bbc=0.2;
abc=0.1;
ooo=abc+bbc;
document.write (ooo.toFixed(1));
结果为: