为什么Python在某些情况下无法判断1.0和1相等,而在其他情况下可以?
下面是一个Python代码:
import sys
import fileinput, string
K = 3
f = raw_input("please input the initial "+str(K)+" lamba: ").split()
Z = []
sumoflamba = 0.0
for m in f:
j = m.find("/")
if j!=-1:
e=float(m[:j])/float(m[j+1:])
else:
e = float(m)
sumoflamba+=e
if e==0:
print "the initial lamba cannot be zero!"
sys.exit()
Z.append(e)
print sumoflamba
if sumoflamba!=1:
print "initial lamba must be summed to 1!"
sys.exit()
当我用0.7、0.2和0.1来运行这个代码时,它会打印出警告并退出!但是当我用0.1、0.2和0.7来运行时,它就正常工作了。0.3、0.3和0.4也能正常运行。我完全搞不懂这是为什么……有人能给我解释一下吗?在这些情况下,“print sumoflamda”都会输出1.0。
3 个回答
0
浮点数不太准确。你越是用它们,误差就越大。有些数字可以被准确表示,但大多数数字不能。比较它们是否相等几乎总是会出错。
0
直接比较浮点数是否相等是一种不好的做法。最好的办法是检查你的数字是否在你想要的范围内。关于浮点数是怎么工作的,详细信息可以查看这个链接:http://en.wikipedia.org/wiki/Floating_point#Internal_representation
5
基本上,Lattyware提供的链接解释了这个问题,但简单来说,你不能指望浮点数的相等比较能正常工作,除非你明确指定精度。如果你把这个值四舍五入或者转换成整数,你就能得到可预测的结果。
>>> f1 = 0.7 + 0.2 + 0.1
>>> f2 = 0.1 + 0.2 + 0.7
>>> f1 == f2
False
>>> round(f1,2) == round(f2,2)
True