我发现VC中对浮点数的类型转化好象有点问题,请看如下程序:double d1=1.16;
double d2=d1*25.0;//d2为29
int i=(int)d2;i的正确结果应该为29,可程序的结果是28,象这样的错误在很多地方还存在,有谁知道该如何解决吗?

解决方案 »

  1.   

    warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data
      

  2.   

    因为误差,计算的结果可能是 28.99.. 转化为 int 的时候去尾成为了 28,可以利用4舍5入:int i = (d2 > 0) (d2 + 0.50) : (d2 - 0.50);
      

  3.   

    int i=(int)d2;
    当你用int强制转化时, 它是用截断。
    所以28.99999999就会变为28.可改为:
    int i=(int)(d2+0.5);
    就会四舍五入了。
      

  4.   

    int i = d2 + 0.001 ;
      

  5.   

    哟,In355Hz(好象一条狗) 的对,
    连负数都想到了。
      

  6.   

    自己做一个“有理数”类,然后再用自己的有理数类来编写代码。为什么会出现错误?
    因为1.16没法完全正确的在计算机上表示(用二进制永远无法表示出1.16),所以就出现了截断溢出,表示的值就只能比1.16小。它再跟25相乘,于是结果就比29稍微小一点。解决:
    一般你在结果后加一个小小的epsilon来调整,如
    #define epsilon 0.000000001
    于是你定义一个转换函数
    int f2n(double d)
    {
        return int(d+epsilon);
    }
    当然,如果是负数有可能是-epsilon,到底是加是减,自己作试验再说
      

  7.   

    你参考一下math.h 中的 floor 和 ceil 函数,一个是取大于它的最小整数,一个是取小于它的最大整数
      

  8.   

    楼上的好象说反了吧?floor是取小于他的最大整数,ceil是大于它的最小整数。
      

  9.   

    In355Hz(好象一条狗) 朋友说的对又考虑全面!
    这是常用而且好用的一种四舍五入的方法!
    赞同!
    推荐!
    祝你进步|!
      

  10.   

    最简单的就是 
    int i = (int)d2 + 1;