a=99.0
cout<<(1.0/a*a==1.0)
给0
,而
cout<<(1*a/a==1.0)
给1
和
cout<<(1.0/99.0*99.0==1.0)
也给1
他们背后的理由是什么? 为什么我改变变量的顺序或当我将它改为实数时, 结果会改变吗?
答案 0 :(得分:1)
浮点数具有有限数量的精度位。
考虑这个例子(在基数10中,为了便于解释,有5个小数位)a
为3.0
:
第一种情况:1.0 / 3.0 * 3.0
这里首先计算除法(1.0 / 3.0),给出中间值0.33333。
然后进行乘法:0.33333 * 3 = 0.99999,其不同于1.0
第二种情况:1.0 * 3.0 / 3.0
在这种情况下,首先执行乘法(1.0 * 3.0),给出一个3.0的中间值,除以3.0,恰好为1.0
正如其他人所说,由于这种影响,将浮点值与==
完全比较并不是一个好主意。