c语言四舍五入问题

legnd 2009-02-25 01:34:57
下面两个语句
printf("%.2f\n",329.155);
printf("%.2f\n",329.985);
输出结果是:
329.15
329.99

第一个输出没有进位,第二个有进位,请问为什么会出现这种原因?
如果要实现保留小数点后两位数的四舍五入该如何实现?
...全文
1582 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
thesecretblue 2009-02-26
  • 打赏
  • 举报
回复
学习中!!!
起点 2009-02-25
  • 打赏
  • 举报
回复
学习!
BeckhamXiao 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 legnd 的回复:]
不好意思,上面写错,是
printf("%.2f\n",(529.180*100+0.5)*0.01);
printf("%.2f\n",(329.180*100+0.5)*0.01);
输出结果:
529.18
329.19

[/Quote]

尝试着高精度转向低精度是要付出代价的。。。
你后面计算的结果是用double存的,但是你尝试着让他用float输出。最后被丢弃了一些精度那不是很正常么,
就好像你想把0.5转成int输出,结果一定是1。


int main()
{
float f1= 329.155;
float f2 = 329.985;
// 测试一
printf("%f\n",f1);
printf("%f\n",f2);
// 测试二
printf("%.2f\n",f1);
printf("%.2f\n",f2);
// 测试三
printf("%.2f\n",329.155);
printf("%.2f\n",329.985);
return 1;
}

legnd 2009-02-25
  • 打赏
  • 举报
回复
不好意思,上面写错,是
printf("%.2f\n",(529.180*100+0.5)*0.01);
printf("%.2f\n",(329.180*100+0.5)*0.01);
输出结果:
529.18
329.19
legnd 2009-02-25
  • 打赏
  • 举报
回复
加0.5这种方法对于上面的数值可以实现,但我试了一下,有些数值还是不行的,如:
printf("%.2f\n",(529.180*100+5)*0.01);
printf("%.2f\n",(329.180*100+5)*0.01);
输出结果是:
529.18
329.19


vip__888 2009-02-25
  • 打赏
  • 举报
回复
利用 强制类型转换就可以做到
先乘1000 在+5 后
除1000 求整
qq675927952 2009-02-25
  • 打赏
  • 举报
回复
up 6L
kool86 2009-02-25
  • 打赏
  • 举报
回复
UP
ForestDB 2009-02-25
  • 打赏
  • 举报
回复
LZ要是真的感兴趣的话,先看看329.155和329.985在机器中存成什么了(就是那个IEEE的标准吧),然后再想想,如果让你来实现一个这样功能的函数“给你特定格式的bit串,然后给出它的浮点数字符串形式”,你会怎么实现,也许还能想出点端倪。
跟了下代码,发现最关键的是个_cfltcvt的调用吧,可惜是汇编写的一大串。
lzonline01 2009-02-25
  • 打赏
  • 举报
回复
加 .5在输出即可
jackxu1982 2009-02-25
  • 打赏
  • 举报
回复
同意1楼的,不光是C语言,大部分程序的四舍五入的实现都是利用+0.5,然后取整来完成的,来个综合类的

double a=10.2345;
int result=0;
a*=1000;
a+=0.5;
result=(int)a;
a=result/1000;


dongpy 2009-02-25
  • 打赏
  • 举报
回复
与小数点后第2位的值有关
guangyou 2009-02-25
  • 打赏
  • 举报
回复
如果要实现保留小数点后两位数的四舍五入该如何实现?
先把那个数乘100再加0.5 取整后在除100.f就可了
float dfdf = int(329.155*100+0.5)/100.f;
printf("%.2f\n",dfdf );
legnd 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sxbwelcome 的回复:]
c语言应该是"五舍六入"
[/Quote]

为什么第二个有进位呢?不好解释,应该不是你说的这样。
sxbwelcome 2009-02-25
  • 打赏
  • 举报
回复
c语言应该是"五舍六入"
waizqfor 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 legnd 的帖子:]
下面两个语句
printf("%.2f\n",329.155);
printf("%.2f\n",329.985);
输出结果是:
329.15
329.99

第一个输出没有进位,第二个有进位,请问为什么会出现这种原因?
如果要实现保留小数点后两位数的四舍五入该如何实现?
[/Quote]
一般都是
float a =329.15;
int b=(int)a;//取整数
int c=(int)(a+0.5);//然后四舍五入
C99好象还有个round(double a);函数 也可以

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧