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

use*_*804 18 c iphone floating-point double objective-c

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

Ste*_*non 64

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

没有可能. 会的.再具体一点:

float f = 4.2;  // f is exactly 4.19999980926513671875
double d = 4.2; // d is exactly 4.20000000000000017763568394002504646778106689453125
Run Code Online (Sandbox Code Playgroud)

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

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

f确切地说4.19999980926513671875,但是你将它与双精度字面值 "4.2"进行比较,它具有值4.20000000000000017763568394002504646778106689453125,因此比较失败.相反,如果您与单精度字面值"4.2f"进行比较:

float f = 4.2;
if (f >= 4.2f) {
    // this block of code is exectued.
}
Run Code Online (Sandbox Code Playgroud)

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

(这也可以提高性能,但这不是理由;执行此操作的原因是因为它会使您的代码更正确).

  • @ user183804:我不会称之为功能或不可避免的问题.更多的是"这是二元浮点的本质,了解它或者注定要在这种事情上绊倒".任何想象力的浮点都不是独一无二的; 人们总是被整数溢出和整数算术的其他方面抛弃.计算机上的算术与我们在学校学习的算法不同,这基本上只是我们作为程序员需要学习使用的事实. (3认同)