我在编程中碰到一下问题,百思不得其解??????????
我要将float类型的数据转换成DWORD类型,
DWORD dd;
float ff;
ff = 0;
for (int i=0;i<100;i++)
{
ff += 0.01;
dd = ff*100;
m_str.Format("%.2f -->  %ld\r\n",ff,dd);
m_str1 += m_str;
}
为什么输出了以下结果??????我标了星号的输出结果都有错,比期望值小1,
为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?0.01 -->  1
0.02 -->  1    *
0.03 -->  2    *
0.04 -->  3    *
0.05 -->  4    *
0.06 -->  6
0.07 -->  7
0.08 -->  8
0.09 -->  8    *
0.10 -->  9    *
0.11 -->  10    *
0.12 -->  11    *
0.13 -->  12    *
0.14 -->  13    *
0.15 -->  15
0.16 -->  16
0.17 -->  17
0.18 -->  18
0.19 -->  19
0.20 -->  20
0.21 -->  21
0.22 -->  22
0.23 -->  23
0.24 -->  24
0.25 -->  25
0.26 -->  26
0.27 -->  27
0.28 -->  28
0.29 -->  29
0.30 -->  30
0.31 -->  31
0.32 -->  32
0.33 -->  32
0.34 -->  33    *
0.35 -->  34    *
0.36 -->  35    *
0.37 -->  36    *
0.38 -->  37    *
0.39 -->  38    *
0.40 -->  39    *
0.41 -->  40    *
0.42 -->  41    *
0.43 -->  42    *
0.44 -->  43    *
0.45 -->  44    *
0.46 -->  45    *
0.47 -->  46    *
0.48 -->  47    *
0.49 -->  48    *
0.50 -->  49    *
0.51 -->  50    *
0.52 -->  51    *
0.53 -->  52    *
0.54 -->  53    *
0.55 -->  54    *
0.56 -->  55    *
0.57 -->  56    *
0.58 -->  57    *
0.59 -->  58    *

解决方案 »

  1.   

    呵呵,浮点数是不精确的,0.02在计算机里可能是0.0199999999999,所以会出现你那种情况!
    最简单的解决办法是
    dd = (ff + 0.00001) * 100;
      

  2.   

    照老兄这样做,果然可以,但是能解释一下原因吗?
    我的程序中金额有的是用float来表示,有的用DWORD表示,所以相互之间有很多转换,这样来解决会不会出问题?比如说有累积错误之类的。
      

  3.   

    对于金额来说,float的冗余度足够了,只要保持保存和计算都使用float,最后显示之前用DWORD不会有问题的
      

  4.   

    哎,算了,我还是全改成用DWORD吧,保险一点,显示地时候再转换成FLOAT显示。
    谢谢各位