灬执着de心 发表于 2014-9-21 16:10:31

一个实现四舍五入的程序

别人问我个简单程序的原理,结果还给问住了{:5_104:}
就是问下面这个代码实现四舍五入,0.565算完是0.560.665算完是0.67
将float改成double就解决了,可我想知道用float为毛是这样

<DIV> #include   <stdio.h>
void main()
{
float h,s;
int k;
h=0.565;//要四舍五入的值
k=h*1000;
k%=10;
if(k>=5)//四舍五入的判断
{
k=h*100+1;
}
else
{
k=h*100;
}
s=k/100.0;
printf("%f\n",s);</DIV>
<DIV> </DIV>
<DIV> h=0.665;//第二个要四舍五入的值
k=h*1000;
k%=10;
if(k>=5)
{
k=h*100+1;
}
else
{
k=h*100;
}
s=k/100.0;
printf("%f\n",s);
}
</DIV>

陨灭 发表于 2014-9-21 16:10:32

楼上正解,因为计算机使用的是二进制,而十进制小数转化二进制的时候如果出现无限循环,或者长度太长以致该数据类型无法装下,就会出现精度丢失的情况。根据不同的情况,可能比原数略大,或者略小,这时候就会发生楼主的问题。楼主用计算器算一下就知道了,0.565和0.665都是无限循环的,这样精度丢失是难免的。正因为如此,我们判断一个float型数据是否等于0的时候,往往并不是判断f==0,而是判断fabs(f)<=1e-7

灬执着de心 发表于 2014-9-23 21:12:35

这么多天还是0回复:mad:

Κυκλοφο 发表于 2014-9-24 01:59:57

本帖最后由 Κυκλοφο 于 2014-9-24 02:15 编辑

上网查了一下相关的东西,可能是单浮点数在表示很小或者很大数值时不是很准确所以在数据转换中就出现问题。
列:2.635在内存中表示为2.6349999999999998   (待考证)
所以就有你那样的问题。
小甲鱼在进制转换里也没讲,不知道说的对不对
页: [1]
查看完整版本: 一个实现四舍五入的程序