我不熟悉使用Python进行编码,并且遇到了非常基本的问题。我在这个网站上搜索了数字不相等但只找到了与Java相关的东西。我有一个非常简单的问题。为什么2.2 = 2.2但2.4!= 2.4?代码如下所示,这是我获得的输出的屏幕截图:https://drive.google.com/file/d/0Bz3Lwr6GHeMLR1Nwc2hJRkZWQ3M/view
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 :(得分:0)
任何存储浮点的语言通常都会将它们存储为IEEE 32或64位二进制文件,这些二进制文件基本上是基础2科学符号,因此永远不会完全符合#34; 2.1"或" 2.4"。因此,要非常谨慎地做任何" =="与代码中的浮点数进行比较。即使数字开始相等,任何数学运算舍入都可能会让你失去一个LSB,从而破坏你的代码。
在您的示例中,更好的方法可能是使用10x浮点值的整数。你的代码也可能更快。需要提供结果时转换为浮点数:
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