我在程序里面需要比较三个数据的大小:
if (DecAssumePos > FreeXDn) then
begin
DecAssumePos := FreeXDn;
end
else if (DecAssumePos < FreeXUp) then
begin
DecAssumePos := FreeXUp;
end;
在Watch里面看到三个变量的数值都是一样的17.672(程序运行到这里三个数值也的确是一样的),
但是偏偏下面的那个分支被执行了,而且我用监视也发现程序认为这三个值都不相等。
我觉得无法理解啊。
各位大侠有没有知道什么原因的,小弟跪谢了。
if (DecAssumePos > FreeXDn) then
begin
DecAssumePos := FreeXDn;
end
else if (DecAssumePos < FreeXUp) then
begin
DecAssumePos := FreeXUp;
end;
在Watch里面看到三个变量的数值都是一样的17.672(程序运行到这里三个数值也的确是一样的),
但是偏偏下面的那个分支被执行了,而且我用监视也发现程序认为这三个值都不相等。
我觉得无法理解啊。
各位大侠有没有知道什么原因的,小弟跪谢了。
解决方案 »
- Oracle 存储过程问题
- 关于 demo/doc/TextEdit 的问题
- FireBird数据库的dbExpress驱动程序是dbexpUIBfire15.dll?
- AdoQuery刷新怪现象,请教各位仁兄
- 关于查询内容的一个select语句!
- 急问:如何使TreeView的某个节点不可见呀!!!!
- 各位大哥,我对inherited这个东西,不是很理解不知道哪位,能给我解释一下!!
- 请问,树状TPageControl 哪儿有?小胖子多谢了!!!
- 用Delphi6向Oracle8中的表插入图片(BLOB)
- 求救啊,怎么统计表中某一行元素出现次数?
- delphi的前景?
- 爱国爱自己的同志请进!不进后悔!!!
同样是你看到的17.672可能在内存中存储时,分别可能是:17.671999999999999和17.6720000000001所以,对浮点数比较不能直接使用=, >, <等。解决方法:将要比较的数做减法,并比较其值小于一个很小的数如0.0000001,则认为这两个数是相等的。
判断a>b,就写为if a+0.0000001>b then
----------------------------
http://scsoft.agrie.com
其实大侠们说的问题我知道,关键是没有想到Delphi在数值比较这样的场合是这样的处理的。
我以前用Fortran是不会有这样的事情的。
而且我不仅是在监视看到这三个数值是相等的,他们是同源的,都是从一个数据转存下来的(并且原始数据我强制只使用了三位小数),只是存储,赋值,转存了多次。可能产生了尾部的误差。
这样的问题我在一个反复叠加的程序中也遇到了。
我本来以为会有处理的官方方法,原来是还是加上容差的。看来还需要多多学习。
我在大富翁论坛上也发了同样的帖子。得到的回答是,Delphi有处理类似问题的两个函数SameValue和CompareVale这两个函数都有容差设置,可以直接完成上面大侠给出的代码。