Python代码浮点运算结果与数学计算不符问题咨询
为什么Python中1.11-1.10和2.11-2.10的结果不是精确的0.01?
这绝对是每个刚碰Python的开发者都会踩的坑!本质原因是计算机使用二进制存储浮点数,而很多十进制小数无法被精确表示为有限长度的二进制小数——就像你在十进制里没法精确写出1/3的结果一样。
举个直观的例子:十进制的0.1,转换成二进制是无限循环的0.0001100110011...,所以Python里存储的0.1其实是这个无限循环数的近似值。同理,1.11、1.10、2.11、2.10这些数在内存里都不是精确的十进制值,而是二进制近似值。当你做减法时,这些近似值的微小误差就会被放大,导致结果和你预期的0.01有偏差。
你可以试着打印出更多小数位来看看实际存储的数值:
d = 1.11 - 1.10 e = 2.11 - 2.10 print('d的精确值:', format(d, '.20f')) print('e的精确值:', format(e, '.20f'))
运行后会看到类似这样的输出:
d的精确值: 0.01000000000000000888
e的精确值: 0.00999999999999978684
这就是为什么看起来相同的运算,结果却不一样——因为原始数值的近似误差在减法中表现出了不同的偏差。
怎么解决这个问题?
如果你需要精确的十进制运算(比如金融计算),推荐使用Python标准库中的decimal模块,它专门用来处理精确的十进制小数:
from decimal import Decimal d = Decimal('1.11') - Decimal('1.10') e = Decimal('2.11') - Decimal('2.10') print('d= ', d, 'e= ', e)
这段代码的输出会完全符合你的预期:d= 0.01 e= 0.01
如果只是需要比较两个浮点数是否相等,不要直接用==,而是判断它们的差的绝对值是否小于一个极小的阈值(比如1e-9):
d = 1.11 - 1.10 expected = 0.01 if abs(d - expected) < 1e-9: print("d等于0.01(近似)")
内容的提问来源于stack exchange,提问作者Thinker
相关产品推荐
相关产品推荐

