2014-06-30 30 views
0

這是我的字典:Python的怪異減法結果

weights = { 
71.03711 : "A", 
156.10111 : "R", 
114.04293 : "N", 
115.02694 : "D", 
103.00919 : "C", 
129.04259 : "E", 
128.05858 : "Q", 
57.02146 : "G", 
137.05891 : "H", 
113.08406 : "I", 
128.09496 : "K", 
131.04049 : "M", 
147.06841 : "F", 
97.05276 : "P", 
87.03203 : "S", 
101.04768 : "T", 
186.07931 : "W", 
163.06333 : "Y", 
99.06841 : "V", 
} 

現在我做一個計算:

a = (129.08346 - 15.99940) # a = 113.08406 = "I" (in dictionary) 

然後:

sequence += weights[a] 

錯誤:

Traceback (most recent call last): 
    File "task2.py", line 43, in <module> 
    sequence += weights[a] 
KeyError: 113.08406000000001 

他爲什麼附加1? :(我需要的價值113.08406

+2

而使用Python的最大[浮點精度的可能重複() ](http://stackoverflow.com/questions/5701317/floating-point-precision-while-using-pythons-max) – vaultah

+0

這是一個浮點精度問題,我敢肯定有很多愚蠢的...基本上,問題是浮動寶詮釋數字造成不好的字典鍵,因爲很難從計算得到完全正確的浮點數。 – mgilson

+0

浮點運算不是很精確。只能存儲很多浮點值,並且如果你的減法沒有精確地打到一個值,那麼將採用最接近的值。而不是使用浮動字典鍵,嘗試乘以100000給整數鍵,這不會有這個問題。 – qaphla

回答

1

結果傳遞到round()功能:

a = round(129.08346 - 15.99940, 5) # second argument is number of decimals 

輸出:

113.08406