我是一个相当绿色的程序员,现在我正在学习Python。我到第17章中的“学会思考就像一个计算机科学家”(类和方法),我只是写了失败的方式我真的不完全我的第一个文档测试理解:Python中数值的陷阱,“有多深?”
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的字符串, t相当于4.7。
但我不明白的是为什么对“point.x”的调用返回4.7000000000000002,而对“print point.x”的调用返回4.7。在其他什么情况下,Python会选择像“打印”一样轮流?这个四舍五入工作如何?这些尾随的重要人物是否会导致编程错误(除了显然是失败的文档之外)?一个不注意四舍五入的人会产生危险的歧义吗?由于这与十进制数的二进制表示有关,我确定这实际上是一个通用的CS问题,而不是Python特有的问题,但我现在真正需要知道的是我可以做的,特别是作为Python程序员,以避免任何相关问题和/或错误感染。
另外,对于奖励积分,还有其他一些Python可以存储浮点数的方式,除了像“a = 4.7”这样的行激活的默认值吗?我知道有Decimal包,但我不完全确定它是如何工作的。老实说,所有这些动态打字的东西有时让我感到困惑。
编辑: 我应该指定,我使用的Python 2.6(在某些时候我想用与NumPy和Biopython)
只要写4.5:对 – kennytm 2010-08-22 16:19:45
最近的Python版本(2.7和3.1)即使没有“print”也会显示4.7。基本的不准确(由于浮点不精确)仍然存在。 – interjay 2010-08-22 16:22:53