//本次核销金额不能大于 单据金额-已核销金额
//明细本次核销金额大于零,注意在生成红单的时候,金额乘以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有关或其他原因。
//明细本次核销金额大于零,注意在生成红单的时候,金额乘以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有关或其他原因。
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;
StrToFloat(FloatToStr(d_bchxje))
这个是Delphi的浮点数存储问题,浮点数在计算机的存储是不精确的存储,比如1,在计算机中存储的可能是1.0000000001,也可能是0.9999999999等等.并不一定是精确的1.0000000000,因此比较浮点数不可以直接用 a = b 来比较,应该用 a - b < 0.00000001 来比较,这后面的值主要根据你允许的误差范围来,但是不能比0.00000001再小,否则比较会不准确,原因是Delphi的Float类型的误差本身可能会超过比它小的值.
想看浮点数的真实值,用Delphi的调试器是不行的,Delphi的调试器显示很不精确,可以用ShowMessageFmt('%.13f', [a]),将显示精度调大点就可以看到里面存的真实值了 :)
用Float,Extended,Double迟早有人会找你麻烦。