delphi中的float型的奇怪问题?

weity123 2007-11-30 09:02:44
//本次核销金额不能大于 单据金额-已核销金额
//明细本次核销金额大于零,注意在生成红单的时候,金额乘以hlbz,
//因为从视图取数,视图中的金额都已经乘以了hlbz,金额变为了负数
d_bchxje:=CDS_Bottom.FieldByName('BchxJe').AsFloat;//明细本次核销金额
d_YsfkJe:=CDS_Bottom.FieldByName('YsfkJe').AsFloat;//明细单据金额
d_Yhxje:=CDS_Bottom.FieldByName('Yhxje').AsFloat;//已核销金额
pfun.ShowMessageOK(floattostr(d_bchxje));
pfun.ShowMessageOK(floattostr(d_YsfkJe-d_Yhxje));
//if (CDS_Bottom.FieldByName('BchxJe').AsFloat)> (CDS_Bottom.FieldByName('YsfkJe').AsFloat-CDS_Bottom.FieldByName('Yhxje').AsFloat) then
if d_bchxje > (d_YsfkJe-d_Yhxje) then
pfun.ShowMessageOK('wxy');
result:='第'+inttostr(i_xh)+'行本次核销金额不能大于未核销金额!';
CDS_Bottom.EnableConstraints;
dxDBBottom.SetFocus;
dxDBBottom.FocusedField := dxDBBottom.FindColumnByFieldName('BchxJe').Field;
exit;
end;


问题: d_bchxje:=CDS_Bottom.FieldByName('BchxJe').AsFloat;//明细本次核销金额
d_YsfkJe:=CDS_Bottom.FieldByName('YsfkJe').AsFloat;//明细单据金额
d_Yhxje:=CDS_Bottom.FieldByName('Yhxje').AsFloat;//已核销金额

这三个变量在delphi中定义的都是double型。从cds取出数,比较d_bchxje > (d_YsfkJe-d_Yhxje)大小。
showmessage()看到的值是相等的,但实际程序走了大于.可能和BCD有关或其他原因。
...全文
1472 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
weity123 2007-12-05
  • 打赏
  • 举报
回复
呵呵。。。我也就要求两位精度的比较,有办法吗?不要太复杂啊。。
Bear_hx 2007-12-04
  • 打赏
  • 举报
回复
8楼说的有理,不过网上也有一些另外的函数。
dirt 2007-12-04
  • 打赏
  • 举报
回复
DEXT正解
dext 2007-12-04
  • 打赏
  • 举报
回复
涉及货币的话,应该用Currency吧。
用Float,Extended,Double迟早有人会找你麻烦。
chenph 2007-12-03
  • 打赏
  • 举报
回复
呵呵,lz是做哪家的ERP呢,还是财务模块.
这个是Delphi的浮点数存储问题,浮点数在计算机的存储是不精确的存储,比如1,在计算机中存储的可能是1.0000000001,也可能是0.9999999999等等.并不一定是精确的1.0000000000,因此比较浮点数不可以直接用 a = b 来比较,应该用 a - b < 0.00000001 来比较,这后面的值主要根据你允许的误差范围来,但是不能比0.00000001再小,否则比较会不准确,原因是Delphi的Float类型的误差本身可能会超过比它小的值.
想看浮点数的真实值,用Delphi的调试器是不行的,Delphi的调试器显示很不精确,可以用ShowMessageFmt('%.13f', [a]),将显示精度调大点就可以看到里面存的真实值了 :)
阿发伯 2007-12-02
  • 打赏
  • 举报
回复
我上面已经说了,浮点数的大于或小于比较是准确的,既然你的代码运行已经走了大于,那就是大于,不能因为“showmessage()看到的值是相等的”而否定大于结果,你看到的是四舍五入后的结果。
budded 2007-12-02
  • 打赏
  • 举报
回复
基础没学扎实,找书看吧
ideation_shang 2007-12-02
  • 打赏
  • 举报
回复
用Extended类型对应Float 不要用Dobule
qxj 2007-12-01
  • 打赏
  • 举报
回复
浮点数运算误差?
StrToFloat(FloatToStr(d_bchxje))
weity123 2007-12-01
  • 打赏
  • 举报
回复
我是要比较大于啊。。不是等于。。浮点数的大小比较怎么解决??/
edongxu 2007-11-30
  • 打赏
  • 举报
回复

if d_bchxje > (d_YsfkJe-d_Yhxje) then //好像少了begin吧
begin
pfun.ShowMessageOK('wxy');
result:='第'+inttostr(i_xh)+'行本次核销金额不能大于未核销金额!';
CDS_Bottom.EnableConstraints;
dxDBBottom.SetFocus;
dxDBBottom.FocusedField := dxDBBottom.FindColumnByFieldName('BchxJe').Field;
exit;
end;
阿发伯 2007-11-30
  • 打赏
  • 举报
回复
显示出来的二者是相等的,比较却走大于很正常啊,浮点数的相等比较是不准确的,但是大于或者小于还是准确的,所以要判断是否相等可以这样:if not ((a > b) or (a < b)) then。也就是a 不大于 b同时a 不小于b就是相等的,否则就是不相等!

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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