高手请解释一下,为什么会这样???为什么会这样???是不是VC的BUG啊!

hucsdn 2002-08-02 10:10:09
我在编程中碰到一下问题,百思不得其解??????????
我要将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 *
...全文
109 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_j76 2002-08-15
  • 打赏
  • 举报
回复
up
hucsdn 2002-08-03
  • 打赏
  • 举报
回复
哎,算了,我还是全改成用DWORD吧,保险一点,显示地时候再转换成FLOAT显示。
谢谢各位
gnctstud 2002-08-03
  • 打赏
  • 举报
回复
应该是浮点数不精确吧
hucsdn 2002-08-02
  • 打赏
  • 举报
回复
照老兄这样做,果然可以,但是能解释一下原因吗?
我的程序中金额有的是用float来表示,有的用DWORD表示,所以相互之间有很多转换,这样来解决会不会出问题?比如说有累积错误之类的。
alanwang_ 2002-08-02
  • 打赏
  • 举报
回复
呵呵,浮点数是不精确的,0.02在计算机里可能是0.0199999999999,所以会出现你那种情况!
最简单的解决办法是
dd = (ff + 0.00001) * 100;
alanwang_ 2002-08-02
  • 打赏
  • 举报
回复
对于金额来说,float的冗余度足够了,只要保持保存和计算都使用float,最后显示之前用DWORD不会有问题的
flyingjust 2002-08-02
  • 打赏
  • 举报
回复
你要两位精度 就定义三位 在四舍五入试试
seanhut 2002-08-02
  • 打赏
  • 举报
回复
2进制在表示大部分小数时永远是不精确的,除非这个小数等于2的n次幂分之一或者是此类小数的有限和.
所以,你不要指望计算结果会很精确,只能用冗余的计算精度来减少误差.

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧