类型转换奇怪问题

flyoxs 2009-01-06 04:12:32
把浮点转为整型精度丢失,请看代码:
代码在VS2005的MFC项目下测试。

int n;
float a = 10;
float b = 0.001;

float v = a / b;
n = (int)v; // 执行后 n = 10000

n = (int)(a / b); // 执行后 n = 9999

我经常把转换写成一条语句,却得不到正确的结果,天啊!
估计是VC的编译器有问题。
请各位达人指点。
...全文
124 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyoxs 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 nineforever 的回复:]
根据标准的规定,浮点运算的结果可以用更高的精度表示
The values of the floating operands and the results of floating expressions may be represented in greater
precision and range than that required by the type;

float b = 0.001; //不能精确表达,80bit的内部结果为+1.0000000474974513e-0003
n = (int)(a / b); // a/b的结果在内部是80bit,+9.9999995250255087e+0003
n = (int)v; …
[/Quote]
强,赞一个!已解惑,谢谢!
nineforever 2009-01-06
  • 打赏
  • 举报
回复
根据标准的规定,浮点运算的结果可以用更高的精度表示
The values of the floating operands and the results of floating expressions may be represented in greater
precision and range than that required by the type;

float b = 0.001; //不能精确表达,80bit的内部结果为+1.0000000474974513e-0003
n = (int)(a / b); // a/b的结果在内部是80bit,+9.9999995250255087e+0003
n = (int)v; // v的类型是float,10000.0。实际上内部作了+9.9999995250255087e+0003->10000.0的转换
两者的精度不同,所以转换为int的结果也不同
flyoxs 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 taodm 的回复:]
2楼即已给出正确答案。
不要再这么玩火当正确了。
[/Quote]
要把浮点转为整型,应该怎么做?我也不想玩火,谢谢
flyoxs 2009-01-06
  • 打赏
  • 举报
回复
谢谢指点。
C++提供的类型转换通常是偏重于类,而不是基本数据类型。
请问这个例子下,我应该用C++的那个转换符?
taodm 2009-01-06
  • 打赏
  • 举报
回复
2楼即已给出正确答案。
不要再这么玩火当正确了。
lann64 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 flyoxs 的回复:]
2 lann64:
类型转换经常是必需的
[/Quote]
1、所以才有“尽量少”得限定词。
2、类型转换并非强制类型转换
3、c++提供了更加安全的类型转换方式,请放弃c带来的强制类型转换。
flyoxs 2009-01-06
  • 打赏
  • 举报
回复
2 lann64:
类型转换经常是必需的
lann64 2009-01-06
  • 打赏
  • 举报
回复
尽量少用强制类型转换。
flyoxs 2009-01-06
  • 打赏
  • 举报
回复
2 xiaoyisnail:
二进制和十进制的小数转换可能出现进制误差,如float x = 0.01f,最终结果是 x = 0.00999998
但我给出的例子应该不是这个问题,否则第一个转换也不会得到正确的结果。
xiaoyisnail 2009-01-06
  • 打赏
  • 举报
回复
浮点数的机器表示本身是不一定精确的
a / b的结果可能是9999.99999999...,强制转换成int的话就是9999
flyoxs 2009-01-06
  • 打赏
  • 举报
回复
换成C++的类型转换符static_cast<int>结果一样

64,654

社区成员

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

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