我在程序里面需要比较三个数据的大小:
if      (DecAssumePos > FreeXDn) then
begin
  DecAssumePos := FreeXDn;
end
else if (DecAssumePos < FreeXUp) then
begin
  DecAssumePos := FreeXUp;
end;
在Watch里面看到三个变量的数值都是一样的17.672(程序运行到这里三个数值也的确是一样的),
但是偏偏下面的那个分支被执行了,而且我用监视也发现程序认为这三个值都不相等。
我觉得无法理解啊。
各位大侠有没有知道什么原因的,小弟跪谢了。

解决方案 »

  1.   

    我用Delphi 7.0 + Windows 2000
      

  2.   

    这是计算机中双精度数的表示问题。我们都知道,双精度数(或是所有的浮点数)在计算机中表示时,并非一个确定的数而只是一个大概。而 =, >, <都是精确比较。
    同样是你看到的17.672可能在内存中存储时,分别可能是:17.671999999999999和17.6720000000001所以,对浮点数比较不能直接使用=, >, <等。解决方法:将要比较的数做减法,并比较其值小于一个很小的数如0.0000001,则认为这两个数是相等的。
      

  3.   

    加一个特别小的数后去判断 比如判断a=b,就写为 if a-b<0.0000001 then
    判断a>b,就写为if a+0.0000001>b then
    ----------------------------
    http://scsoft.agrie.com
      

  4.   

    首先感谢两位大侠的参与,
    其实大侠们说的问题我知道,关键是没有想到Delphi在数值比较这样的场合是这样的处理的。
    我以前用Fortran是不会有这样的事情的。
    而且我不仅是在监视看到这三个数值是相等的,他们是同源的,都是从一个数据转存下来的(并且原始数据我强制只使用了三位小数),只是存储,赋值,转存了多次。可能产生了尾部的误差。
    这样的问题我在一个反复叠加的程序中也遇到了。
    我本来以为会有处理的官方方法,原来是还是加上容差的。看来还需要多多学习。
    我在大富翁论坛上也发了同样的帖子。得到的回答是,Delphi有处理类似问题的两个函数SameValue和CompareVale这两个函数都有容差设置,可以直接完成上面大侠给出的代码。