为什么0.1+0.2!=0.3

来自Wikioe
跳到导航 跳到搜索


0.1+0.2=0.30000000000000004?

使用常用的语言计算“0.2+0.1”的时候,结果不是“0.3”,而是“0.30000000000000004”,而不同的“0.1+0.6”的结果却是“0.7”:


首先,计算机中是使用二进制表示对应的数值的,十进制整数转二进制采用“除2取余,逆序排列”的方法得到,而小数的转换采用“乘2取整,顺序排列”的方法,如下:

  1. 用2乘十进制小数,得到积;
  2. 将积的整数部分取出,再用2乘余下的小数部分,又得到一个积;
  3. 重复以上两部,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。

示例:

  0.625  x  2  =  1.25  整数部分  1
  0.25   x  2  =  0.5   整数部分  0
  0.5    x  2  =  1    整数部分  1
  
  0.625 的二进制为 0.101


但是,并非所有小数都能被表示为二进制,如0.1:

  0.1  x  2  =  0.2  整数部分  0
  0.2  x  2  =  0.4  整数部分  0
  0.4  x  2  =  0.8  整数部分  0
  0.8  x  2  =  1.6  整数部分  1
  0.6  x  2  =  1.2  整数部分  1
  0.2  x  2  =  0.4  整数部分  0
  0.4  x  2  =  0.8  整数部分  0
  0.8  x  2  =  1.6  整数部分  1
  0.6  x  2  =  1.2  整数部分  1
  ...

所以 0.1 的二进制为 0.00011001100110011...,在计算机中并不能被精确表示。


所以,计算机的单精度、双精度数都是采用近似值表示,只是二者的精度有所不同(32位、64位):

0.1 的双精度浮点数的二进制为:0.00011001100110011001100110011001100110011001100110011001

0.2 的双精度浮点数的二进制为:0.00110011001100110011001100110011001100110011001100110011

二者相加等于:0.01001100110011001100110011001100110011001100110011001100

转换为十进制:0.30000000000000004


所以 0.1+0.2 != 0.3,而是一个近似值。如果要进行高精度计算,应该使用类似“BigDecimal”的数据类型。