float浮点型变换为int整型数据失真
float浮点型转换为int整型数据失真
工作中遇到的问题 具体为题如下所示:
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++;
}
------解决方案--------------------
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这个所谓的极小值不能保证绝对可靠
------解决方案--------------------
工作中遇到的问题 具体为题如下所示:
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++;
}
------解决方案--------------------
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这个所谓的极小值不能保证绝对可靠
------解决方案--------------------
- C/C++ code
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
------解决方案--------------------
- C/C++ code
float f=4.99; printf("%.32f\n",f); f = f*100; printf("%.32f\n",f); 4.98999977111816410000000000000000 498.99996948242187000000000000000000