社区
C语言
帖子详情
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
打赏
收藏
double型四舍五入问题
double charge=17.435 double ret; ret=int(charge*100 + 0.5)/100.0 结果:17.43 如果第三个小数位不是5,结果均正确. 如果是float类型也正确. 实在不明白其中的原因.....谢谢解答!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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相加之后取整会变成零了,写程序中应该避免这种情况。
MySQL 数据类
型
和运算符
Re: MySQL 数据类
型
和运算符 ============================= # 数据类
型
整数类
型
:五种 TINY SMALL MEDIUM INT BIG 浮点和定点小数类
型
:三种 FLOAT
DOUBLE
DECIMAL 日期与时间数据类
型
:五种 YEAR -1 字符串类
型
...
取消
double
的
四舍五入
如何取消
double
的
四舍五入
double
众所周知
double
称为双精度浮点数,占八个字节,用%lf输出,默认输出六位小数,不足六位用0补齐,超过六位
四舍五入
截断。 一般来说,我们平时做题的时候较多都是保留两位小数即可,...
double
的
四舍五入
找了好多的
double
四舍五入
,但好多都是舍弃,计0.005保留两位小数不是0.01而是0.00,计实现原理是直接舍弃后面的小数了。。。。。 下面是自己写的,不过可能由于环境
问题
,需要改动。 原理很简单,
double
精度
问题
...
double
进行
四舍五入
在mysql中,round函数用于数据的
四舍五入
,它有两种形式: 1、round(x,d) ,x指要处理的数,d是指保留几位小数 这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0; ...
double
类
型
转换int整
型
四舍五入
简单方法
四舍五入
取整======》大于0.5进一
四舍五入
取整======》0.5舍去,0.51进一
四舍五入
凑整======》小数点舍去,进一(前提小数点后大于0.00)
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章