float型转化int型问题!!!!!

lt403647596 2013-11-29 01:59:21
float f1 = 0.01f;
f1 = f1 * 100;
//float f2=1.0f;
int a = (int)f1;
这样a就为0;但如果把第三行的注释去掉以后,a就等于1了。为什么?????还有为什么a会为0;
...全文
1424 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Burcy Wen 2013-12-02
  • 打赏
  • 举报
回复
你加一个容差,编译器对浮点都是不准确的,f1 = f1 * 100;改为f1 = (f1+1e-6) * 100;试试
赵4老师 2013-12-02
  • 打赏
  • 举报
回复
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理,用二进制小数也不能精确表示某些10进制小数。
see1990 2013-11-30
  • 打赏
  • 举报
回复
不要被你的显示器说欺骗
Todd_Pointer 2013-11-29
  • 打赏
  • 举报
回复
这个应该是编译器优化+调试器Bug吧。 理论上不应该的。 至于 0.01 * 100 == 1 基本不会出问题,0.01 * 100虽然在二进制表示下基本是 0.9999... , 但 1.0 也是一样的值, 所以 0.01 * 100 == 1.0 一般是没有问题的。
unituniverse2 2013-11-29
  • 打赏
  • 举报
回复
精度相关的问题。没有哪个对哪个错误,只要强转整形的误差在1以内都是正确的(当然是转小不转大才能算正确) 解决方法当然就是四舍五入了。。 (int)(f1+0.5f) 如果确实是想补到边界,也得先确定一个误差精度(个人觉得意义不大),比如百分之1: (int)(f1+0.01f) 其实这种问题就是浮点数比较的问题。而浮点数比较是不能用简单如整形或者指针的表达方式解决的: if(i1 != 0)正常的表达方式; if(f1 != 0.0f)往往得不到期望的响应效果
byxbai1989 2013-11-29
  • 打赏
  • 举报
回复
http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html 应该是和编译软件有关,在linux上确认,输出是正确的。
baichi4141 2013-11-29
  • 打赏
  • 举报
回复
浮点数无法精确表示0.01这个小数 在执行乘除之前,精度就已经损失了
  • 打赏
  • 举报
回复
不要将0.01写到代码中 用scanf或者cin>>读取 f1值。
lt403647596 2013-11-29
  • 打赏
  • 举报
回复
编译器不同,你的2008做优化了吧,我这边只能用vc的。
引用 10 楼 adeng1919 的回复:
引用 9 楼 lt403647596 的回复:
[quote=引用 7 楼 adeng1919 的回复:] [quote=引用 5 楼 lt403647596 的回复:] 下断点检查的时候f1显示也是1.0f但是一转话成int就变成0了。
不会出现这种情况啊
[/quote][/quote] 编译器不同,你的2008做优化了吧,我这边只能用vc的。
lt403647596 2013-11-29
  • 打赏
  • 举报
回复
vc6.0的编译环境,我还能骗你们怎么的。哎
lt403647596 2013-11-29
  • 打赏
  • 举报
回复
懒懒的吉他手 2013-11-29
  • 打赏
  • 举报
回复
引用 9 楼 lt403647596 的回复:
引用 7 楼 adeng1919 的回复:
[quote=引用 5 楼 lt403647596 的回复:]
下断点检查的时候f1显示也是1.0f但是一转话成int就变成0了。
不会出现这种情况啊

[/quote]
lt403647596 2013-11-29
  • 打赏
  • 举报
回复
引用 7 楼 adeng1919 的回复:
引用 5 楼 lt403647596 的回复:
下断点检查的时候f1显示也是1.0f但是一转话成int就变成0了。
不会出现这种情况啊

max_min_ 2013-11-29
  • 打赏
  • 举报
回复
引用 5 楼 lt403647596 的回复:
下断点检查的时候f1显示也是1.0f但是一转话成int就变成0了。
我在一楼就说明了!不可能的!这应该是代码有bug或者编译器有问题!
懒懒的吉他手 2013-11-29
  • 打赏
  • 举报
回复
引用 5 楼 lt403647596 的回复:
下断点检查的时候f1显示也是1.0f但是一转话成int就变成0了。
不会出现这种情况啊
lt403647596 2013-11-29
  • 打赏
  • 举报
回复
我是在vc环境上运行的、
lt403647596 2013-11-29
  • 打赏
  • 举报
回复
下断点检查的时候f1显示也是1.0f但是一转话成int就变成0了。
lt403647596 2013-11-29
  • 打赏
  • 举报
回复
那怎么来避免浮点型产生的误差那?
懒懒的吉他手 2013-11-29
  • 打赏
  • 举报
回复
float是16位的,表达0.01的时候,实际上是0.0099999998,*100也不到1 不过我在VS2008的环境下运行,a是等于1的
  • 打赏
  • 举报
回复
浮点数的误差 100*0.01 != 1 很正常
加载更多回复(1)

64,679

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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