- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我用 gcc 4.4.1 编译了下面的程序,我得到了意外的输出(好吧,对我来说是意外的)
#include<stdio.h>
int main()
{
float x=0.3, y=0.7;
if(x==0.3)
{
if(y==0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}
Output: NONE
#include<stdio.h>
int main()
{
float x=0.3, y=0.7;
if(x<0.3)
{
if(y==0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}
Output: NONE
#include<stdio.h>
int main()
{
float x=0.3, y=0.7;
if(x>0.3)
{
if(y>0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}
Output:X
所以,很明显,x的值大于0.3,y的值小于0.7
为什么会这样?这是 float 数据类型的属性还是 if-else 语句以不同的方式解释 float?
谢谢。
编辑:好吧,我仔细考虑了一下,现在有点糊涂了。请告诉我我对这个问题的理解是否正确。
float x=0.3;
这会将 x=0.30000001192092895508
存储在内存中。显然,这大于 0.3
(这是正确的吗?)
现在,double x=0.3
结果是 x=0.29999999999999998890
并且它小于 0.3(这也正确吗?)
主要问题:因此,如果我在 float x
中使用 store 0.3
,则以下语句 if(x>0.3)
会导致 x=0.30000001192092895508
被隐式转换为 double 而 0.3 也是 double 而不是 float。因此 0.3=0.29999999999999998890
并且内部操作是 if((double) 0.30000001192092895508 > (double) 0.29999999999999998890)
。这是正确的吗?
最佳答案
您正在使用 float
进行存储,但是您正在对类型为 double
的文字进行比较。
x
和 y
的值不完全是 0.3 和 0.7,因为这些数字不能用二进制 float 表示。碰巧最接近 0.3 的 float
大于最接近 0.3 的 double
,而最接近 0.7 的 float
小于最接近的 double
到 0.7... 因此您的比较结果。
假设表示与 C# 中的相同(我碰巧有一些工具可以提供帮助),所涉及的值是:
0.3 as float = 0.300000011920928955078125
0.3 as double = 0.299999999999999988897769753748434595763683319091796875
0.7 as float = 0.699999988079071044921875
0.7 as double = 0.6999999999999999555910790149937383830547332763671875
这就解释了为什么会发生这种情况……当然,它并没有解释如何解决您的代码实际尝试执行的问题。如果您能为更大的问题提供更多背景信息,我们或许能够提供更多帮助。
关于c - If-else block 和 float 数据类型的意外结果。 [编辑了一个问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623984/
我是一名优秀的程序员,十分优秀!