double转unsigned int的困惑!

cyy200 2004-08-04 03:19:59
.....
double i=2.3;
unsigned int j=i;
unsigned int k=(i-j)*100.0;
........
为什么输出出k=29,而不是k=30;???要得30该怎么办??
...全文
287 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellwolf 2004-08-04
  • 打赏
  • 举报
回复
double转int时,编译器会在编译期给出警告,这种转换丢失信息
dodont 2004-08-04
  • 打赏
  • 举报
回复
叹,好。
wmajia 2004-08-04
  • 打赏
  • 举报
回复
楼上的猜测应该是对的,在VC下看了下生成的汇编代码如下,有浮点运算,遇不懂,但 ST0 = +2.99999999999999822e-0001:还是用红色显示的,比较明显:)

48: unsigned int k=(i-j)*100.0;
00401321 mov eax,dword ptr [ebp-0Ch]
00401324 mov dword ptr [ebp-18h],eax
00401327 mov dword ptr [ebp-14h],0
0040132E fild qword ptr [ebp-18h]
00401331 fsubr qword ptr [ebp-8]
00401334 fmul qword ptr [__real@8@4005c800000000000000 (0042a020)]
0040133A call __ftol (0040147c)
0040133F mov dword ptr [ebp-10h],eax
49:
50: cout<<k<<endl;



EAX = 00000002 EBX = 7FFDF000
ECX = 00000000 EDX = 00000000
ESI = 00000000 EDI = 0012FF80
EIP = 00401334 ESP = 0012FF1C
EBP = 0012FF80 EFL = 00000202 CS = 001B
DS = 0023 ES = 0023 SS = 0023 FS = 0038
GS = 0000 OV=0 UP=0 EI=1 PL=0 ZR=0 AC=0
PE=0 CY=0

0042A020 = 4059000000000000

ST0 = +2.99999999999999822e-0001
ST1 = +0.00000000000000000e+0000
ST2 = +0.00000000000000000e+0000
ST3 = +0.00000000000000000e+0000
ST4 = +0.00000000000000000e+0000
ST5 = +0.00000000000000000e+0000
ST6 = +0.00000000000000000e+0000
ST7 = +0.00000000000000000e+0000
CTRL = 027F STAT = 3820 TAGS = 3FFF
EIP = 00401331 CS = 001B DS = 0023
EDO = 0012FF78
铖邑 2004-08-04
  • 打赏
  • 举报
回复
可能是i=2.3内部表现是2.2999999......,所以结果是29,可以通过四舍五入得到30
unsigned int k=(i-j)*100.0+0.5;

64,634

社区成员

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

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