0.1+0.2 !==0.3

281 阅读2分钟

在JavaScript里,0.1+0.2并不等于0.3。
为什么呢?

知识点:

  • 在JavaScript中,浮点型数据在计算机中是通过64位的二进制存储

float.png

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("你算对了");
   }

1b81bb6ff6a80cb1bb1a82f33333484.png 可以看出控制台弹出了 "你算对了"
所以 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));

结果为: 44deff2760850921790b2a75e797114.png