python - 为什么比较具有相同值的两个属性类型 `float` 和 `int` 在 Python 中得到 `False`?

标签 python floating-point-comparison

<分区>

让我们考虑下面的代码

代码:

#!/usr/bin/env python

class Foo():
    def __init__(self, b):
        self.a = 0.0
        self.b = b
    def count_a(self):
        self.a += 0.1

foo = Foo(1)
for i in range(0, 15):
    foo.count_a()
    print "a =", foo.a, "b =", foo.b, '"a == b" ->', foo.a == foo.b

输出:

a = 0.2 b = 1 "a == b" -> False
a = 0.4 b = 1 "a == b" -> False
a = 0.6 b = 1 "a == b" -> False
a = 0.8 b = 1 "a == b" -> False
a = 1.0 b = 1 "a == b" -> True
a = 1.2 b = 1 "a == b" -> False
a = 1.4 b = 1 "a == b" -> False
a = 1.6 b = 1 "a == b" -> False
a = 1.8 b = 1 "a == b" -> False
a = 2.0 b = 1 "a == b" -> False
a = 2.2 b = 1 "a == b" -> False
a = 2.4 b = 1 "a == b" -> False
a = 2.6 b = 1 "a == b" -> False
a = 2.8 b = 1 "a == b" -> False
a = 3.0 b = 1 "a == b" -> False

但是如果我将 11 行的代码更改为 foo = Foo(2),输出将变为:

a = 0.2 b = 2 "a == b" -> False
a = 0.4 b = 2 "a == b" -> False
a = 0.6 b = 2 "a == b" -> False
a = 0.8 b = 2 "a == b" -> False
a = 1.0 b = 2 "a == b" -> False
a = 1.2 b = 2 "a == b" -> False
a = 1.4 b = 2 "a == b" -> False
a = 1.6 b = 2 "a == b" -> False
a = 1.8 b = 2 "a == b" -> False
a = 2.0 b = 2 "a == b" -> False *
a = 2.2 b = 2 "a == b" -> False
a = 2.4 b = 2 "a == b" -> False
a = 2.6 b = 2 "a == b" -> False
a = 2.8 b = 2 "a == b" -> False
a = 3.0 b = 2 "a == b" -> False

您会看到输出 a = 2.0 b = 2 "a == b"-> False 非常奇怪。我想我可能误解了 Python 中 OOP 的一些概念。请向我解释为什么会出现这种意外输出以及如何解决这个问题。

最佳答案

这与面向对象无关——它与计算机在内部表示 float 的方式和舍入误差有关。 http://floating-point-gui.de/basic/

此处 Python 的特殊性是 float 的默认字符串表示形式,与用于 pretty-print 的内部表示形式相比,它会将它们四舍五入到更少的小数位。

虽然,对于需要正确比较的人来说,尊重 float 的比例,Python 引入了一个很好的机制 PEP 485 , 它将 math.isclose 函数添加到标准库中。

关于python - 为什么比较具有相同值的两个属性类型 `float` 和 `int` 在 Python 中得到 `False`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38722340/

相关文章:

python - 从 Mongodb 检索数据并使用 django 将其显示在前端

python - 在 Python 中的特定网络位置打开 Windows 资源管理器

python - 尝试写入文件,但收到错误消息,指出写入需要文件对象而不是字符串

python - 如何实现rust-cpython as_object()和into_object()?

python - 检查特定的浮点值是否在 Python/numpy 的列表/数组中

c++ - 使用整数表示和 ULP 的别名正确比较 double

c++ - 为什么发布/调试对 std::min 有不同的结果?

python - 在 pd DataFrame 中为每个组创建相对值