中易网

C++浮点数比较,百思不得其解啊!

答案:5  悬赏:10  
解决时间 2021-04-09 16:31
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;
最佳答案
第一给我就不用说了吧
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;
}
全部回答
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
浮点数在cpu里,以二进制存储,“x2顺取整”得 无限循环小数 所以,各个厂家的cpu对它的处理不一,又不能只截取循环部分,所以,多为补位,使得所其变大,所以,应该尽量避免直接做浮点数的比较,化整或运用数组都是简易的处理方式
LZ没有弄明白计算机的浮点数计算,去看看计算机原理吧。 简单的说,在计算机里,浮点数的计算是近似计算,也就是数学逼近。 所以 0.02*100很可能不等于2.0,而是2.0附近的一个数字 况且LZ还写成了>=2
浮点数的概念请看计算机组成原理。也可以看看ieee754标准。 浮点数的相等问题,只能用两个浮点数的差的绝对值小于某个值来判断。误差无法避免。float的精度大概是小数点后的6位到7位。如果要减少误差可以用double.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我办中华名人手抄报,需几个板块,已有名人档
计算机科学与技术和软件工程哪个专业比较接近
以“我敬佩他”为题的作文开头怎么写?150字左
词语搭配:()的海湾 ()的躺着 () 的应对
颜记饵丝怎么去啊,有知道地址的么
求:反贪风暴2高清版,百度云盘,,,要的是(
山东莒县于家庄傅氏家族是何年从山西洪洞县太
东莞治安好吗??
陈凯歌导演的无极又被网友戏称一个什么引发的
跨六的 打团有人要么
国欢东路在什么地方啊,我要过去处理事情
众泰z100不挂牌可以吗?是不是输于老年代步车
大学二年级四班 怎么翻译? class 4 sophomor
求卡耐基口才的艺术与人际关系全集PDF
武林外传里老白他娘来客栈是哪一集?
推荐资讯
大溪丰大桥怎么去啊,有知道地址的么
韩城在哪里啊,我有事要去这个地方
ps在黑色空白图层上用镜头光晕后为何成了白色
黄辣丁可以和地图鹦鹉鱼一起养吗
我想买些豆豉酱却不知道哪里有卖的,求帮住
农村建房有没有明文规定相邻的两间房,中间要
今年在做账时发现去年费用多计了,汇算清缴已
求图片:音符图片
在六西格玛中提到了"关键的少数".
我刚刚在游民星空下载了刺客信条1,免安装中
天津有个人收古钱币的吗
长泰县工商局兴泰工业区行政指导工作站在哪里
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?