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

时间:2011-02-17 03:57:55

标签: iphone objective-c c floating-point double

在iPhone应用程序中使用double或float数据类型时,我遇到了“> =”和“< =”比较的问题,因为当为变量分配了一个小数位输入的数字时,例如4.2 ,比较中使用的float或double实际上可能有一个值,如4.1999998092651367。由于这种差异,诸如“> = 4.2”的比较是假的而不是真的。我该如何避免这个问题?

1 个答案:

答案 0 :(得分:63)

  

当为变量分配一个带有一个小数位的数字时,例如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为后缀,以使它们具有单精度。

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

相关问题