float a=float(0.01);//0.01
int m_a=int(a*100); //1float temp=a*100;//1
int m_b=int(temp);//1CString str;
str.Format("%d,%d",m_a,m_b);
MessageBox(str);//0,1
为什么不是1,1;

解决方案 »

  1.   

    我测试的结果是0,0
    没什么奇怪, 浮点数的精度是有限的. 我估计 0.01f * 100,结果肯定不会正好等于一(精度问题), 那么就有两种可能,一种是比1稍大,比如: 1.0000000000000001
    还有一种就是比1稍小, 比如0.999999999999999999999998如果是后一种的话,那么转换成 int 就会等于一. 因为这个转型是去尾的.不是四舍五入.
    我试着用 %f 输出 a, a*100, 结果是 : 
    ---------------------------
    FLOAT TEST
    ---------------------------
    0.010000,1.000000
    ---------------------------
    确定   
    ---------------------------似乎是正确的,于是我提高输出精度到20位(实际的float 精度好象不超过15位,不知道有没有记错)
    然后再次输出 a, a*100, 得到下面的结果:
    ---------------------------
    FLOAT TEST
    ---------------------------
    0.00999999977648258210,0.99999997764825821000
    ---------------------------
    确定   
    ---------------------------
    呵呵,看出来了,果然不是正确的 0.01 而是比 0.01 稍小一点点. 大约误差 3*10^(-10). 由此看来float 应该没有15位的精度.
      

  2.   

    浮点转整型不要用
    str.Format("%d,%d",m_a,m_b);你可以试试这样:1、  int(m_a) + (m_a - int(m_a) > 0)//取上值,
    1、  int(m_a) + (m_a - int(m_a) >= 0.5)//四舍五入
      
      

  3.   

    int m_a=int(a*100); 
    会不会编译器将a先自动转换成了int类型,然后再进行了*100,最后赋值给m_a--所以结果为0.(猜测)
      

  4.   

    wormwwww说得不明不白的呵,再自己看看自己的话。
    fanqing猜的不对吧?
      

  5.   

    wormwwww(大虫) 
    ---------------
    m_a 本来就是整型, 下面这两句起什么作用?
     fanqing(火影忍者+28%(准备学习进程/线程)) ( * * ) 
    ------------------------------------------------
    一个浮点数跟一个整数运算,一定是先转换成浮点数的,结果是浮点,赋值给整形的时候又会进行一次转换, 就整数
      

  6.   

    这只是浮点运算误差引起的
    VC用的是
    mov DWORD PTR _a$[ebp], 1008981770 ; 3c23d70aH
    ; Line 5
    fld DWORD PTR _a$[ebp]
    fmul DWORD PTR __real@4@4005c800000000000000        //0.01*100
    运算结果可以能为0.99999..,不到1.0,而int转换是调用ftol,它只会得到整形部分,就为0了
    -----------------------------------------------------------------------------------
    我用VC为 0,0 ,它都是调用的fmul
    ---------------------------------------------------
    用BCB或GCC,结果为0,1,因为它用
    fstp dword 
    取回结果时,又会有误差,把它进为1了
      

  7.   

    我调试了一下,浮点处理器的返回为(ST0)
    0.9999999776482582528(3FFE FFFFFFA0 00000000)
    当然,取int后,结果为0