我是一個相當綠色的程序員,現在我正在學習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