2014-10-27 79 views
-2

我是新來的Python編碼,並且遇到了一些非常基本的問題。我在這個網站上搜索的數字不相同,但只找到與Java相關的東西。我有一個非常簡單的問題。爲什麼2.2 = 2.2但2.4!= 2.4?代碼介紹如下,這裏是輸出我得到的截圖:https://drive.google.com/file/d/0Bz3Lwr6GHeMLR1Nwc2hJRkZWQ3M/view2.4爲什麼不等於2.4? Python/NumPy

import os 
import numpy 

Mmin = 2.1 
Mmax = 6.5 

Magnitude = numpy.arange(Mmin, Mmax, 0.10) 
print Magnitude 

x = Magnitude[1] 
y = 2.2 
print x 
print y 
print x == y 

a = Magnitude[3] 
b = 2.4 
print a 
print b 
print a == b 
+0

什麼'再版( a)'show?或'格式(a,'.53f')?' – 2014-10-27 17:26:02

+0

我認爲a可能更像是2.400000000000000004,嘗試'abs(a-b)<= 0.000001' – 2014-10-27 17:29:58

+0

abs(a-b)<= 0.000001出現TRUE。 repr(a)= 2.40000000000000004和格式(a,'。53f')= 2.40000000000000035527136788005009293556213378906250000 – 2014-10-27 17:37:37

回答

0

,存儲浮動點通常將它們存儲爲IEEE 32位或64位的二進制文件,基本上基地2科學計數法的任何語言,因此永遠不會完全是「2.1」或「2.4」。因此,在代碼中對浮點進行任何「==」比較時要非常謹慎。即使數字開始平等,任何數學運算舍入都可能會導致您丟失一個LSB​​,從而破壞您的代碼。

在您的示例中,更好的方法可能是使用10倍浮點值的整數。你的代碼也可能會更快。當你需要給出一個結果時,轉換爲浮點數:

import os 
import numpy 

Mmin = 21 
Mmax = 65 

Magnitude = numpy.arange(Mmin, Mmax, 1) 
print Magnitude 

x = Magnitude[1] 
y = 22 
print x 
print y 
print x == y 

a = Magnitude[3] 
b = 24 
print a 
print b 
print a == b 

下面是一些示例代碼,顯示它更清晰一些。我使用的是1/9這恐怕是不能在基地2座10浮點表示可以準確地表示:

x = 1.0/9.0 

y = 0 
for i in range(1,15): 
    y += x 
    z = i * x 
    print 'y =', 
    print '%.20f'%y, 
    print ' z =', 
    print '%.20f '%z, 
    print z == y 

輸出是這樣的:

y = 0.11111111111111110494 z = 0.11111111111111110494 True 
y = 0.22222222222222220989 z = 0.22222222222222220989 True 
y = 0.33333333333333331483 z = 0.33333333333333331483 True 
y = 0.44444444444444441977 z = 0.44444444444444441977 True 
y = 0.55555555555555558023 z = 0.55555555555555558023 True 
y = 0.66666666666666674068 z = 0.66666666666666662966 False 
y = 0.77777777777777790114 z = 0.77777777777777767909 False 
y = 0.88888888888888906159 z = 0.88888888888888883955 False 
y = 1.00000000000000022204 z = 1.00000000000000000000 False 
y = 1.11111111111111138250 z = 1.11111111111111116045 False 
y = 1.22222222222222254295 z = 1.22222222222222209886 False 
y = 1.33333333333333370341 z = 1.33333333333333325932 False 
y = 1.44444444444444486386 z = 1.44444444444444441977 False 
y = 1.55555555555555602432 z = 1.55555555555555535818 False 
+0

這是提出更多的問題,它回答!所以我猜想當我導入數據時,數據也不準確?除非我在導入它之前將所有東西都乘以使它沒有任何小數位? – 2014-10-27 18:08:50

+0

這取決於你想要對數據做什麼。這將是「確切的」,我認爲。 64位浮點數保持很高的精度。如果你從一個文件導入數據,它可能是一個字符串,它會在你做什麼之後決定什麼會在shuffle中丟失。 – 2014-10-27 18:15:44

+0

如果您仍然遇到問題,可以考慮提出一個新問題,提供您想要做什麼的更多細節。 – 2014-10-27 18:29:06