我是一个相当绿色的程序员,我现在正在学习 Python。我已经读到“Learn to Think Like a Computer Scientist”(类和方法)的第 17 章,我刚刚写了我的第一个 doctest,但以一种我真的不完全理解的方式失败了:
class Point(object):
'''
represents a point object.
attributes: x, y
'''
def ___init___(self, x = 0, y = 0):
'''
>>> point = Point()
>>> point.y
0
>>> point = Point(4.7, 8.2)
>>> point.x
4.7
'''
self.x = x
self.y = y
第二个 doctest__init__
失败,并返回 4.7000000000000002 而不是 4.7。但是,如果我用“打印”语句重写 doctest,如下所示:
>>> point = Point(4.7, 8.2)
>>> print point.x
4.7
它运行正确。
所以我阅读了 Python 如何存储浮点数,现在我明白了,由于十进制数的二进制表示,差异的原因是 Python 将 4.7 存储为 1 和 0 的字符串,几乎但不完全等于 4.7 .
但我不明白为什么对“point.x”的调用返回 4.7000000000000002 而对“print point.x”的调用返回 4.7。在其他什么情况下,Python 会像使用“print”一样选择舍入?这个四舍五入是如何工作的?这些尾随的重要数字是否会导致编程错误(显然,除了失败的文档测试)?不注意舍入会产生危险的歧义吗?
由于这与十进制数的二进制表示有关,我确信这实际上是一个一般的 CS 问题,而不是特定于 Python 的问题,但我现在真正需要知道的是我能做什么,特别是作为一个Python 程序员,以避免任何相关问题和/或错误侵扰。
此外,对于奖励积分,除了由“a = 4.7”之类的行激活的默认值之外,Python 是否还有其他方式可以存储浮点数?我知道有 Decimal 包,但我不完全确定它是如何工作的。老实说,所有这些动态类型的东西有时会让我感到困惑。
编辑: 我应该指定我使用的是 Python 2.6(有时我想使用 NumPy 和 Biopython)