为什么0.1+0.2!=0.3
跳到导航
跳到搜索
0.1+0.2=0.30000000000000004?
使用常用的语言计算“0.2+0.1”的时候,结果不是“0.3”,而是“0.30000000000000004”,而不同的“0.1+0.6”的结果却是“0.7”:
首先,计算机中是使用二进制表示对应的数值的,十进制整数转二进制采用“除2取余,逆序排列”的方法得到,而小数的转换采用“乘2取整,顺序排列”的方法,如下:
- 用2乘十进制小数,得到积;
- 将积的整数部分取出,再用2乘余下的小数部分,又得到一个积;
- 重复以上两部,直到积中的小数部分为零,此时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”的数据类型。