可能重复:
Why can't decimal numbers be represented exactly in binary?
Program not entering if statement
所以我试图运行一个有两个变量的程序,当一个变量等于另一个变量时,它会执行一个函数。在这种情况下,打印垃圾邮件。但是,出于某种原因,当我运行这个程序时,即使我知道它们是相同的,我也没有得到任何输出。
g=0.0
b=3.0
while g < 30.0:
if g==b:
print "Hi"
g+=.1
print g, b
答案 0 :(得分:9)
您假设将.1足够的时间添加到0.0将产生3.0。这些是浮点数,它们是不准确的。舍入错误使得该值永远不会完全等于3.0。您几乎不应该使用==
来测试浮点数。
答案 1 :(得分:6)
执行此操作的一种好方法是使用整数值进行计数(例如,将i从0到300的循环减1)并仅在使用浮点值时缩放计数器(例如,设置f = i * .1) 。当你这样做时,循环计数器总是精确的,所以你得到你想要的精确迭代,并且只有一个浮点舍入,它不会从迭代到迭代累积。
循环计数器通常是整数类型,因此很容易看出加法是准确的(直到达到溢出)。但是,循环计数器也可以是浮点类型,前提是您确定它的值和操作是精确的。 (常见的32位浮点格式表示从-2 24 到+2 24 的整数。除此之外,它没有精确表示整数的精度。它并不完全代表.1,所以你不能用.1的增量来计算。但是你可以用.5,.25,.375或其他两个中等幂的倍数来增加,这两个中等幂可以完全表示。)
答案 2 :(得分:0)
为了扩展Karoly Horvath的评论,你可以做些什么来测试近似相等是选择一个相对于最小增量非常非常小的值(让我们称之为epsilon)。假设epsilon是1.0 * 10 ^ -6,比你的增量小五个数量级。 (它应该基于浮点表示的平均舍入误差,但这会有所不同,这只是一个例子)。
然后你要做的是检查g和b是否小于epsilon不同 - 如果它们足够接近它们实际上是相等的,实际上和实际上是舍入误差之间的差异,你接近epsilon。 / p>
检查
abs(g - b) < epsilon
并且您将进行几乎但不完全相等的检查,这对于大多数用途来说应该足够好。