在iPhone应用程序中使用double或float数据类型时,我遇到了“> =”和“< =”比较的问题,因为当为变量分配了一个小数位输入的数字时,例如4.2 ,比较中使用的float或double实际上可能有一个值,如4.1999998092651367。由于这种差异,诸如“> = 4.2”的比较是假的而不是真的。我该如何避免这个问题?
答案 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
为后缀,以使它们具有单精度。
(这也可以提高性能,但这不是理由;这样做的原因是因为它会使你的代码更正确。)