float浮点型转换为int整型数据失真

时间:2023-01-19 16:06:14
 工作中遇到的问题 具体为题如下所示:
  float a=4.99
  a=a*100;
  int b=(int)a;
  调试的结果
  a=499;
  b=498;
麻烦帮小弟想想办法避免这个错误;

下面是我工作的代码,目的是计算数值的小数位数
float temp =4.99;
int xiaoshuweishu=0;
while (temp-(int)temp>0.0000000001)
{
   temp=temp*10;
   xiaoshuweishu++;
}

8 个解决方案

#2


目的就是错误

#3


float temp =4.99;// 楼主所谓的失真源于这一步

三进制的0.1换算成十进制就是0.333333333333……
十进制的有限小数换算成二进制,大多都是无限循环小数
0.99换算成有理分数为99/100,分母100中含有因子5,因此0.99无法被转换成二进制有限小数,不管是float还是double,都不可能精确保存它
要精确保存小数,唯一可靠的方法就是把它的小数点后各位作为整数来保存

while ( temp-(int)(temp + 0.000001 ) > 0.000001 )
这种写法可能能够满足楼主的要求,但不可靠
float的有效数据位数是6~7位,上面的0.000001这个所谓的极小值不能保证绝对可靠

#4


这个方法我也试过了  不行

#5


精度问题,还有就是有些十进制数是无法用有限的二进制数位表示的,这样就会出现误差,换double试试

#6


float a=4.99f;
a=a*100.0f;
int b=(int)(a+0.5f);
printf("a=%.0f,b=%d\n",a,b);//a=499,b=499

#7



float f=4.99;
printf("%.32f\n",f);
f = f*100;
printf("%.32f\n",f);

4.98999977111816410000000000000000
498.99996948242187000000000000000000

10进制小数无法用二进制完全表示,你还是用字符串比较靠谱

#8


谢谢大家的关注!
void FloatTranInt(void)
{
char str[10];
float F_test=4.99;//传任意浮点型 以4.99为例  
int  sig=7,i=0,j=0;
CString strNewVale;
//将F_test的数据以字符的形式储存到str字符数组中
gcvt(F_test,sig,str);
//将字符串str[]中内含的空格字符找出,并显示空格字符的ASCII码
for(i=0;i <strlen(str)&&!isspace(str[i]);i++)
{
//将str的数据传入CString类型strNewValue中去
strNewValue += str[i];  
}
if(!strNewValue.IsEmpty())
//将strNewValue中的数据转换为int整型   
int I_test =atoi(strNewValue);
F_test=F_test*100;
}
输出结果
F_test=499;
I_test=499;

#1


#2


目的就是错误

#3


float temp =4.99;// 楼主所谓的失真源于这一步

三进制的0.1换算成十进制就是0.333333333333……
十进制的有限小数换算成二进制,大多都是无限循环小数
0.99换算成有理分数为99/100,分母100中含有因子5,因此0.99无法被转换成二进制有限小数,不管是float还是double,都不可能精确保存它
要精确保存小数,唯一可靠的方法就是把它的小数点后各位作为整数来保存

while ( temp-(int)(temp + 0.000001 ) > 0.000001 )
这种写法可能能够满足楼主的要求,但不可靠
float的有效数据位数是6~7位,上面的0.000001这个所谓的极小值不能保证绝对可靠

#4


这个方法我也试过了  不行

#5


精度问题,还有就是有些十进制数是无法用有限的二进制数位表示的,这样就会出现误差,换double试试

#6


float a=4.99f;
a=a*100.0f;
int b=(int)(a+0.5f);
printf("a=%.0f,b=%d\n",a,b);//a=499,b=499

#7



float f=4.99;
printf("%.32f\n",f);
f = f*100;
printf("%.32f\n",f);

4.98999977111816410000000000000000
498.99996948242187000000000000000000

10进制小数无法用二进制完全表示,你还是用字符串比较靠谱

#8


谢谢大家的关注!
void FloatTranInt(void)
{
char str[10];
float F_test=4.99;//传任意浮点型 以4.99为例  
int  sig=7,i=0,j=0;
CString strNewVale;
//将F_test的数据以字符的形式储存到str字符数组中
gcvt(F_test,sig,str);
//将字符串str[]中内含的空格字符找出,并显示空格字符的ASCII码
for(i=0;i <strlen(str)&&!isspace(str[i]);i++)
{
//将str的数据传入CString类型strNewValue中去
strNewValue += str[i];  
}
if(!strNewValue.IsEmpty())
//将strNewValue中的数据转换为int整型   
int I_test =atoi(strNewValue);
F_test=F_test*100;
}
输出结果
F_test=499;
I_test=499;