Iphone 比较objective C中的float和double数据类型
在iPhone应用程序中使用double或float数据类型时,我遇到了“>=”和“=4.2”为false而不是true的问题。我怎样才能避免这个问题 当一个变量被分配一个小数点后一位的数字时,例如4.2,比较中使用的浮点或双精度实际上可能有一个值,例如4.1999998092651367 不是梅将。具体而言:Iphone 比较objective C中的float和double数据类型,iphone,objective-c,c,floating-point,double,Iphone,Objective C,C,Floating Point,Double,在iPhone应用程序中使用double或float数据类型时,我遇到了“>=”和“=4.2”为false而不是true的问题。我怎样才能避免这个问题 当一个变量被分配一个小数点后一位的数字时,例如4.2,比较中使用的浮点或双精度实际上可能有一个值,例如4.1999998092651367 不是梅将。具体而言: float f = 4.2; // f is exactly 4.19999980926513671875 double d = 4.2; // d is exactly 4.2000
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.200000000000000177635683940025046778106689453125
,因此比较失败。相反,如果与单精度文字“4.2f”进行比较:
比较成功,因为值完全相等。浮点是复杂的,但它是完全确定的;要使其更直观,最简单的方法之一就是不要混淆精度。如果您使用的是float
,请确保您的所有文字都以f
作为后缀,以使它们也具有单精度
(这也可以提高性能,但这不是这样做的原因;这样做的原因是因为它会使您的代码更加正确)。另请参见,您是否同时遇到
float
和double
变量的问题?请发布一些示例代码?谢谢你帮我澄清。现在,代码在整数上使用“f”后缀进行比较时,效果与预期一样。接下来,浮点运算的这种问题是一个“特征”还是一个不可避免的问题?似乎有些东西很容易从看似合乎逻辑且编译没有问题的代码中引入计算错误。@user183804:我不会将其称为功能或不可避免的问题。更多的是“这是二进制浮点的本质,了解它或者注定会被这类事情绊倒”。它不是任何想象中的浮点运算所独有的;人们总是被整数溢出和整数运算的其他方面所抛弃。计算机上的算术与我们在学校学的算术不同,这基本上是我们作为程序员需要学习的一个事实。再次感谢。我将带着这些新知识复习我所有的代码。你帮了我很大的忙,因为我即将推出的iPhone应用程序处理医学计算,所以准确性至关重要。我发现这是一个很好的参考:根据我链接的文章,你可以尝试将数字作为整数进行比较。。如果它们彼此在1个整数范围内,则它们彼此在一个浮点/双精度步长范围内。如果您知道两个参数都不是零,则可以在某个最小精度范围内比较浮点/双精度。
float f = 4.2;
if (f >= 4.2f) {
// this block of code is exectued.
}