比较目标C中的float和double数据类型

当在iPhone应用程序中使用double或float数据类型时,我遇到了“> =”和“ = 4.2”是错误的而不是真的。 我该如何避免这个问题?

当为变量分配一个带有一个小数位的数字时,例如4.2,比较中使用的float或double实际上可能有一个值,例如4.1999998092651367

不是。 会的 。 再具体一点:

 float f = 4.2; // f is exactly 4.19999980926513671875 double d = 4.2; // d is exactly 4.20000000000000017763568394002504646778106689453125 

当你写下这样的东西时会出现问题:

 float f = 4.2; if (f >= 4.2) { // this block of code is not executed. } 

f正好是4.19999980926513671875 ,但是您将它与双精度字面值 “4.2”进行比较,其值为4.20000000000000017763568394002504646778106689453125 ,因此比较失败。 相反,如果您与单精度字面值“4.2f”进行比较:

 float f = 4.2; if (f >= 4.2f) { // this block of code is exectued. } 

比较成功,因为值完全相等。 浮点很复杂,但它完全是确定性的; 您可以做的最简单的事情之一就是不要混合精确度。 如果您正在使用float ,请确保所有文字都以f为后缀,以使它们具有单精度。

(这也可以提高性能,但这不是理由;这样做的原因是因为它会使你的代码更正确)。