print(0.4+0.2==0.6)
print(0.1+0.2==0.3)
print(0.1+0.7==0.8)
print(0.4+0.8==1.2)
以上输出均为False
这是为什么还有哪些是特殊的
因为在计算机中,小数是以二进制保存的,导致其精度会有缺失。
Python 中使用双精度浮点数来存储小数。在 Python 使用的 IEEE 754 标准(52M/11E/1S)中,8字节64位存储空间分配了52位来存储浮点数的有效数字,11位存储指数,1位存储正负号,即这是一种二进制版的科学计数法格式。虽然52位有效数字看起来很多,但麻烦之处在于,二进制小数在表示有理数时极易遇到无限循环的问题。其中很多在十进制小数中是有限的,比如十进制的 1/10,在十进制中可以简单写为 0.1 ,但在二进制中,他得写成:0.0001100110011001100110011001100110011001100110011001…..(后面全是 1001 循环)。因为浮点数只有52位有效数字,从第53位开始,就舍入了。这样就造成了标题里提到的”浮点数精度损失“问题。 舍入(round)的规则为“0 舍 1 入”,所以有时候会稍大一点有时候会稍小一点。
就像10进制下1除以3是个无限循环小数一样,在3进制下就能整除
但凡在二进制下无法整除的那些小数,都会有精度丢失的问题
浮点数直接判断相等是有风险的。正确判断方法应该是两者之差小于一个有效精度,比如
a = 0.4+0.2
b = 0.6
if(fabs(a-b) < 0.0001)
printf("a=b");
print(round(0.4 + 0.2 ,1) == 0.6)
print(round(0.1 + 0.2 ,1) == 0.3)
print(round( 0.1 + 0.7,1 ) == 0.8)
print(round( 0.4 + 0.8,1 ) == 1.2)