int main(int argc, char* argv[])
{
float f1 = 0.02;
if (f1>=2.0)//此处为何是false???
{
printf("%f",f1);
}
return 0;
}
为什么if比较后会是false???
还有:
int main(int argc, char* argv[])
{
float f1 = 0.02;
if ((f1*100)>=2)//此处为何还是false???
{
printf("%f",f1);
}
return 0;
}
求解
谢谢各位,非常感谢,第一个写错了,应该是f1>0.02;
C++浮点数比较,百思不得其解啊!
答案:5 悬赏:10
解决时间 2021-04-09 16:31
- 提问者网友:生亦何欢
- 2021-04-08 19:20
最佳答案
- 二级知识专家网友:蜜罐小熊
- 2021-04-08 20:14
第一给我就不用说了吧
0.02是肯定小于2 的 ,if的判断条件不成立,所以没有输出
关键是第二个,这就关系到浮点数和整形在内存中的存储方式了
简单点说就是int i=2,那么他存放在内存中的就是2
但是float i=2 那么,他存在内存中就可能是1.999999或2.000001
当然,这个例子有点极端
下面接着说,所以浮点型的判断就不能像整型那样用 == 来判断相等了
取而代之的是求俩个数的差,当他们小到一定范围的时候就认为他们相等了
abs()求绝对值 1e-6 = 0.000001
下面给出第二个程序修改后的代码
#include
#include
int main(int argc, char* argv[])
{
float f1 = 0.02;
if (abs((f1*100)-2)<=1e-6)
{
printf("%f",f1);
}
return 0;
}
0.02是肯定小于2 的 ,if的判断条件不成立,所以没有输出
关键是第二个,这就关系到浮点数和整形在内存中的存储方式了
简单点说就是int i=2,那么他存放在内存中的就是2
但是float i=2 那么,他存在内存中就可能是1.999999或2.000001
当然,这个例子有点极端
下面接着说,所以浮点型的判断就不能像整型那样用 == 来判断相等了
取而代之的是求俩个数的差,当他们小到一定范围的时候就认为他们相等了
abs()求绝对值 1e-6 = 0.000001
下面给出第二个程序修改后的代码
#include
#include
int main(int argc, char* argv[])
{
float f1 = 0.02;
if (abs((f1*100)-2)<=1e-6)
{
printf("%f",f1);
}
return 0;
}
全部回答
- 1楼网友:我的任性你不懂
- 2021-04-09 00:00
if (f1>=2.0)//此处为何是false???
//因为0.02<2,所以你这里判断是否满足0.02>2当然就是不满
//足,也就是False
//**************************
if ((f1*100)>=2)//此处为何还是false???
//在计算机里面,float类型的数据和double类型的数据都是
//采取无限近似的数据存储的,譬如你这里的float f=0.02;
//在存储的时候就可能是float f=0.0200000000000000001;
//这后面位数的数据由cpu以及随机因素决定的
//所以你这里的f可能是0.02000000000001
- 2楼网友:强势废物
- 2021-04-08 23:22
浮点数在cpu里,以二进制存储,“x2顺取整”得 无限循环小数
所以,各个厂家的cpu对它的处理不一,又不能只截取循环部分,所以,多为补位,使得所其变大,所以,应该尽量避免直接做浮点数的比较,化整或运用数组都是简易的处理方式
- 3楼网友:木子香沫兮
- 2021-04-08 23:01
LZ没有弄明白计算机的浮点数计算,去看看计算机原理吧。
简单的说,在计算机里,浮点数的计算是近似计算,也就是数学逼近。
所以 0.02*100很可能不等于2.0,而是2.0附近的一个数字
况且LZ还写成了>=2
- 4楼网友:啵啵桃汀
- 2021-04-08 21:44
浮点数的概念请看计算机组成原理。也可以看看ieee754标准。
浮点数的相等问题,只能用两个浮点数的差的绝对值小于某个值来判断。误差无法避免。float的精度大概是小数点后的6位到7位。如果要减少误差可以用double.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯