为什么Python在某些情况下无法判断1.0和1相等,而在其他情况下可以?

0 投票
3 回答
1604 浏览
提问于 2025-04-17 16:13

下面是一个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

撰写回答