这个是 IEEE 754 浮点数标准的问题,所以在很多编程语言中 0.1 + 0.2 并不等于 0.3:
- >>> 0.1 + 0.2 == 0.3
- False
- >>> 0.1 + 0.2
- 0.30000000000000004
- >>> 9 + 0.99999999999999999999999999
- 10.0
复制代码
想要解决这个问题,可以使用
math 模块的 ulp() 函数:
- >>> import math
- >>> 0.1 + 0.2 == 0.3 + math.ulp(0.3)
- True
- >>> 0.1 + 0.2 - math.ulp(0.3) == 0.3
- True
- >>> 9.99999999999999999999999999 - math.ulp(9.99999999999999999999999999)
- 9.999999999999998
- >>> int(9.99999999999999999999999999 - math.ulp(9.99999999999999999999999999))
- 9
复制代码
由于浮点数的定义规则决定了它是没有办法完全精确的表示一个小数,只能尽量接近。
所以在学习编程语言的时候,我们是极力阻止大家去拿浮点数进行等值判断的。
对浮点数为什么会产生误差感兴趣的话,还可以参考一下这篇文章 ->
浮点数:表示更大范围的小数