double型四舍五入问题

crylufa 2005-01-11 01:49:32
double charge=17.435
double ret;

ret=int(charge*100 + 0.5)/100.0

结果:17.43

如果第三个小数位不是5,结果均正确.

如果是float类型也正确.

实在不明白其中的原因.....谢谢解答!


...全文
424 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
QD_IceWolf 2005-01-11
  • 打赏
  • 举报
回复
关注。
不过,好像将其改成 ret=int(charge*1000 + 5)/1000.0 是对的。
Popo_CN 2005-01-11
  • 打赏
  • 举报
回复
学习中
寻开心 2005-01-11
  • 打赏
  • 举报
回复
和这个问题类似的是另外一个
浮点数和0相比交的问题

安全的做法也都是引入一个精度误差允许量

f和0的比较转换成为
if ( f<FloatError && f>-FloatError )

在数值计算上,浮点和整数的差距还是瞒大的, 处处都要担心这个误差的问题
寻开心 2005-01-11
  • 打赏
  • 举报
回复
呵呵
二进制和十进制不同的
0.5 0.25, 0.125, .... 可以被准确的表达
100, 1000这样的十进制下的整数,在浮点方式的表达下也许就是不同的了
100也许被表示成为了 99.9999999999
而1000就可能表示成了 1000.00000000001
因此相应的乘法结果, 17.435*100 也许结果就是1743.4999999999
而17.435*1000的结果就是 17435.00000000001

对于17.435来说可以通过*1000,替换*100而达到目的
换另外一个数据还未必能够成立呢

所以相对安全的做法,还是
return int ( v*100 + 0.5f + FloatError ) 为好
#define FloatError 1.0e-7
#define DoubleError 1.0e-15
yjh1982 2005-01-11
  • 打赏
  • 举报
回复
原因是int(charge*100 + .50f)会把小数点后的数滤掉(.999999)
所以你小数点三位就charge*1000+5.0
小数点后四位,就charge*10000+5.0
....
yjh1982 2005-01-11
  • 打赏
  • 举报
回复
double charge=17.435;
double ret;

ret=int(charge*1000 + 5.0f)/1000.0;
return ;


得到正确结果-_-
snow810211 2005-01-11
  • 打赏
  • 举报
回复
长见识!
yjh1982 2005-01-11
  • 打赏
  • 举报
回复
不好意思,在C环境下编写的.
yjh1982 2005-01-11
  • 打赏
  • 举报
回复
有没有搞错?楼主的代码编译不过.去掉int后正常



charge=17.43499999999
ret=17.439999999999998
liuerting 2005-01-11
  • 打赏
  • 举报
回复
在计算机里,10 个0.1 相加 也不是精确等于 1 的。记得老师说过,是误差还是什么的。需要采取别的方法作保证。
somedummy 2005-01-11
  • 打赏
  • 举报
回复
原因应该是17.435引起的,而不是0.5,原因上面也有人说了,真正的0.5表示的时候是可以完全表示出来的。而17.435应该是小于17.435的,所以加起来以后就不对了,你试试看加上0.51,这样应该也能得到正确的结果
寻开心 2005-01-11
  • 打赏
  • 举报
回复
两个单纯的0.5相加取整应该不是0的
没有验证,但是感觉不会是
因为0.5在二进制表示可以是一个整数啊
寻开心 2005-01-11
  • 打赏
  • 举报
回复
true
关键是那个*100, 搞的鬼
结果会象楼上所说的那种样子的
你可以加一个类似0.000001这样一个数进行保护的
zoohoo 2005-01-11
  • 打赏
  • 举报
回复
double型得0.5可能在寄存器中是0.49999999999999表示的,这就是为什么两个0.5相加之后取整会变成零了,写程序中应该避免这种情况。

69,369

社区成员

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

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