遇到一个问题,在delphi中连接后台SQl server数据库,建一个表Test,有三个字段,qty1,qty2,qty3,数据类型都是number(28,8),在delphi界面中加一个DBGrid,然后写以下代码:
 if ADOQuery1.FieldByName('Qty1').AsVariant<(ADOQuery1.FieldByName('Qty2').AsVariant+ADOQuery1.FieldByName('Qty3').AsVariant) then
    ShowMessage('Qty1:'+ADOQuery1.FieldByName('Qty1').AsString+#13+'Qty2:'+ADOQuery1.FieldByName('Qty2').AsString+#13+'Qty3:'+ADOQuery1.FieldByName('Qty3').AsString);用以下数据测试:qty1=46.55,qty2=44.83,qty3=1.72奇怪的事情出现了,竟然qty1<(qty2+qty3),晕倒了,是Bug吗?

解决方案 »

  1.   

    起码的常识
    浮点数的误差问题浮点数的比较通常这么写abs(qty1-(qty2+qty3))< Deta其中Deta 是你允许的精度范围
    比如 0.00001 这类的
      

  2.   

    ieee745协议的问题因为qty1=46.55,qty2=44.83,qty3=1.72,这三个数在二进制表达中可能有某个或者全部都为无理数,所以会有精度缺失
      

  3.   

    通过类型转换可消除误差:
    例:
      qry1.fieldbyname('sl').Asfloat-strtofloat(EdtSl.Text)   //值相等时结果不为零有误差
      strtofloat(qry1.fieldbyname('sl').AsString)-strtofloat(EdtSl.Text)  //值相等时结果为零无误差
      

  4.   

    用currency代表小数,不过只能是小数四位的。
    浮点数就是有误差的。