double到int的奇怪情况

bbnhh 2011-05-16 10:40:19
请高手解释一下:
double i = 0.6;
int j = i*10.0;
printf("%d\n", j);
输出5
(i换成0.7,输出6)

我想可能是double到int转换时精度丢失,

但是。。。。
double i = 0.6;
printf("%f\n", i*10.0);
竟然输出的是6.00000, 这样的话转换到int不该输出5啊???

到底是为什么呢???
...全文
202 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xialong0410 2011-05-16
  • 打赏
  • 举报
回复
用2008试了一下是6,不是5
flyrack 2011-05-16
  • 打赏
  • 举报
回复
是gcc的问题 如果用float类型就是正常的
晨星 2011-05-16
  • 打赏
  • 举报
回复
如果楼主还想问:“那打印浮点数的时候保留多少位小数才能绝对精确呢?”答案是“多少位也做不到”,这是浮点数的特性决定的。
Thirty 2011-05-16
  • 打赏
  • 举报
回复
向ls学习。。。。。。
晨星 2011-05-16
  • 打赏
  • 举报
回复
比如数值5.999999999……,用舍入法(比如四舍五入)保留5位小数会变成:6.00000,而用舍去法变成整数就是5。
晨星 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 bb143 的回复:]
double i = 0.6;
printf("%f\n", i*10.0);
竟然输出的是6.00000, 这样的话转换到int不该输出5啊???……
[/Quote]
——这个推理不成立。
原因是:浮点数保留5位小数输出时一般采用“舍入法”,而转换成整数时一般采用“舍去法”。
不管是哪种,浮点数的精度问题都是存在的,所以,从前面输出的“6.00000”不能证明后面应该输出“6”。
赵4老师 2011-05-16
  • 打赏
  • 举报
回复
double用%lg
float用%g
我是风 2011-05-16
  • 打赏
  • 举报
回复
CodeBlocks10.05是5
sk_sakula 2011-05-16
  • 打赏
  • 举报
回复
VC6.0是6啊,应该是编译器的问题啊
bbnhh 2011-05-16
  • 打赏
  • 举报
回复
本人用的code blocks 10.05,
难道是这个编译器的问题???!!!
好垃圾啊!!!

晕!!
我真的是琦琦 2011-05-16
  • 打赏
  • 举报
回复
VC6.0输出6
luciferisnotsatan 2011-05-16
  • 打赏
  • 举报
回复
如果想要四舍五入,一个简单的方法就是加0.5

int j = i*10.0 + 0.5;
AnYidan 2011-05-16
  • 打赏
  • 举报
回复
不好意思
vs2010 输出 6
luciferisnotsatan 2011-05-16
  • 打赏
  • 举报
回复
编译器问题么?
可能乘下来是5.999999999这个接近于6的书。转int后就5了

我用的是vs2005,输出是6
ljt3969636 2011-05-16
  • 打赏
  • 举报
回复
什么编译器啊


double i = 0.6;
int j = i*10.0;
printf("%d\n", j);


是输出0.6啊

69,369

社区成员

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

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