,存儲浮動點通常將它們存儲爲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
什麼'再版( a)'show?或'格式(a,'.53f')?' – 2014-10-27 17:26:02
我認爲a可能更像是2.400000000000000004,嘗試'abs(a-b)<= 0.000001' – 2014-10-27 17:29:58
abs(a-b)<= 0.000001出現TRUE。 repr(a)= 2.40000000000000004和格式(a,'。53f')= 2.40000000000000035527136788005009293556213378906250000 – 2014-10-27 17:37:37