10年 Java程序员,硬核人生!勇往直前,永不退缩!

欢迎围观我的git:https://github.com/R1310328554/spring_security_learn 寻找志同道合的有志于研究技术的朋友,关注本人微信公众号: 觉醒的码农,或Q群 165874185

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

 2.0 == 2.000 当然,显而易见,应该是相等的,

>>> 2.0 == 2.000
True
True
>>> 2.0 == 2
True

 

 但是,如果有很小的浮点尾数呢?

 

>>> 2.0 == 2.000000000000000000000000001
True
。。。
>>> 2.0 == 2.0000000000000000001
True
>>> 2.0 == 2.0000000000000001
True
>>> 2.0 == 2.000000000000001
False
>>> 2.0 == 2.00000000000001
True
>>> 2.0 == 2.000000001
False

>>> 0.1+0.2
0.30000000000000004
>>> 0.1+0.2 == 0.30000000000000004
True
>>> 0.1+0.2 == 0.3000000000000004
False
>>> 0.1+0.2 == 0.30000000000000004
True
>>> 0.1+0.2 == 0.300000000000000041
True
>>> 0.1+0.2 == 0.300000000000000041212
True
>>> 0.1+0.2 == 0.300000000000000044444
True

>>> 0.1+0.2 - 0.300000000000000044444
0.0
>>> 0.1+0.2 - 0.30000000000000004999
0.0
>>>

 

 

 神奇吧, 为什么呢? 其实就是 浮点数的神奇之处了。

 

在 Python 中,比较 2.0 == 2.0000000000000000001 返回 True 是由于浮点数的表示方式和精度限制。浮点数在计算机中使用二进制浮点数格式来近似表示,这种格式基于 IEEE 754 标准。

浮点数的表示涉及到一个尾数(mantissa)和一个指数(exponent)。由于二进制和十进制的转换,某些十进制小数无法精确地用二进制表示。例如,十进制的 0.1 在二进制中是一个无限循环小数,无法用有限的位数精确表示。

当你看到 2.0 == 2.0000000000000000001 时,实际上是因为 2.00000000000000000012.0 在二进制浮点数表示中的一个近似值。由于精度限制,2.0 在内存中的二进制表示可能与 2.0000000000000000001 相同,因此 Python 认为它们是相等的。

这种现象在很多编程语言中都存在,不仅限于 Python。它揭示了浮点数计算的一个常见陷阱:浮点数的不精确性。

要处理浮点数的比较,可以采取以下方法:

  1. 使用一个小的阈值:当比较两个浮点数是否相等时,检查它们之间的绝对差值是否小于某个小的阈值(如 1e-9)。

  2. 避免直接比较:如果可能,避免直接比较两个浮点数是否相等,而是使用比较操作符来检查它们是否足够接近。

  3. 使用整数:如果问题允许,使用整数而不是浮点数来避免精度问题。

  4. 使用 decimal 模块:Python 的 decimal 模块提供了更高精度的十进制数运算。

  5. 理解并利用 IEEE 754:了解 IEEE 754 标准的工作原理,以及如何在特定情况下处理浮点数。

记住,当你在 Python 中看到类似的比较结果时,并不是说两个数真的相等,而是它们在计算机的浮点数表示中足够接近,以至于 Python 认为它们相等。

 

 

posted on 2024-07-14 23:25  CanntBelieve  阅读(17)  评论(0编辑  收藏  举报