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这个所谓的极小值不能保证绝对可靠
三进制的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;
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这个所谓的极小值不能保证绝对可靠
三进制的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;
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;