_variant_t aa;
aa.fltVal=0.65;
float aff=aa.fltVal*60.0;//aff=39.0000
int nn=(int)aff;
得到nn却是38?!
有朋友说应该这样:aa.fltVal=(float)0.65;
但是如果不用这种方法呢?(我的aa是某函数的返回值)
我的问题出在哪里呢?
bow
aa.fltVal=0.65;
float aff=aa.fltVal*60.0;//aff=39.0000
int nn=(int)aff;
得到nn却是38?!
有朋友说应该这样:aa.fltVal=(float)0.65;
但是如果不用这种方法呢?(我的aa是某函数的返回值)
我的问题出在哪里呢?
bow
int nn=(int)aff;
语句后另加一句
int n2=(int)aff;
那么,执行结果:
nn=38
n2=39
两个相同的语句,结果居然不一样,明显是VC的bug。把aff换成double类型,可以发现aff是38.9999...,是很接近39的一个整数。
把int nn=(int)aff;换成两个语句;
int nn = 0;
nn = (int)aff;
可以得到nn=39的正确结果。
可见,是VC在优化代码的时候出了点问题。回头看刚才那两句
int nn=(int)aff;
int n2=(int)aff;
按alt+8看它的汇编代码
可以发现第一句的汇编代码比第二句少了一行。好像是调用_ftol函数之前的准备参数部分少了,它的汇编看不大懂的说。问题就在这里。临时的解决方案,还是把nn先初始化为零值再说。建议换一个编译器试试看,或者向微软发送bug报告。
(以上测试环境是VC6)
int nn=(int)(aa.fltVal*60.0);
float不是一种比较精确的类型,你可以换为double试试
float aff;
aff=aa.fltVal*((float)60.0)
试试呢
这样不行的
=============
原贴中
如果把aa.fltVal=0.65;其中的0.65换为0.60结果却是对的
同时感谢needways(needways)的关注,虽未有最完美解答,但鄙人还是受益匪浅
谢谢各位朋友的关注