_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

解决方案 »

  1.   

    这个问题的确很古怪。在
    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)
      

  2.   

    估计程序的运行并不是完全按你的构想去做的,编译过程中把
    int nn=(int)(aa.fltVal*60.0);
    float不是一种比较精确的类型,你可以换为double试试
      

  3.   

    试过了,换为double的话,aa.fltval本来是39反而会变为38.9999xxxx,这样的话也是错的
      

  4.   

    把float aff=aa.fltVal*60.0;//aff=39.0000改为
    float aff;
    aff=aa.fltVal*((float)60.0)
    试试呢
      

  5.   

    to pengjd(悲酥清风)
    这样不行的
    =============
    原贴中
    如果把aa.fltVal=0.65;其中的0.65换为0.60结果却是对的
      

  6.   

    对于skyMountain(天山) 的深入分析深表感谢!
    同时感谢needways(needways)的关注,虽未有最完美解答,但鄙人还是受益匪浅
    谢谢各位朋友的关注