var 
  a:double;
  s:string;
begin
  a := 8.07;
  s := formatfloat('#.####################',a);
  showmessage(s);
end;大家猜猜结果是什么:8.07000000000000028为什么呢?Delphi怎么这么奇怪?

解决方案 »

  1.   

    我一旦使用ADOConnection.Open之后
    a := 8.07000000000000028;s := formatfloat('#.####################',a);s显示都还是8.07,为什么呢?
      

  2.   

    我一旦使用ADOConnection.Open之后
    a := 8.07000000000000028;
    -----------------------------------------------
    a := 8.07000000000000028;与使用ADOConnection.Open有什么关系?楼主没有说.假设a是从数据表里提取出来的,那请楼主看一下该字段的精度是多少.
      

  3.   

    a := 8.07;
      s := formatfloat('#.####################',a);
      showmessage(s);//显示8.07000000000000028
      ADOConnection.Open
      a := 8.07;
      s := formatfloat('#.####################',a);
      showmessage(s);//显示8.07
      

  4.   

    在32位Windows系统里:Double类型:表示范围:±5.0 * 10^-324 ~ 1.7 * 10^308  有效位:15~16位。所以,把你的formatFloat这样改一下,试试:
    var
     a : double;
     s:string;
    begin
      a := 8.07;
      s := formatfloat('#.##############',a);//注意,小数点后15个#
      edit1.text := s ;//显示8.07  s := format('%1.15f',[a]);
      edit2.text := s ; //显示8.070000000000000  建议用format()
    end;使用format()转换,既使你发现的adoconnection问题,也不复存在了。
    你的问题,首先是你的精度超出了double的范围。
      

  5.   

    哦,关于位数,我说的可能是错的。但是使用format()没错。
      

  6.   

    var 
      a:double;
      s:string;
      vADOConnection:Variant;
    begin
      a := 8.07;
      s := formatfloat('#.################',a);//s显示8.07000000000000028
      vADOConnection := CreateOleObject('ADODB.Connection');
      vADOConnection.ConnectionString := 'Driver={Firebird/InterBase(r) driver};pwd=masterkey;Uid=SYSDBA;database=C:\123.GDB';
      try 
        vADOConnection.Open;
      Except
      end;
      a := 8.07;
      s := formatfloat('#.################',a);//s显示8.07
    end;
    以上如何实现上下都是8.07000000000000028??????
      

  7.   

    我的知识不够专业,因此只能说估计:我估计是因为你的#的个数超出了实数的精度范围而致。其实,我估计,8.07显示为8.000000000000028这样,本身就是一个错误。请看一下我在上面的回复。正确的结果应该是显示为8.07或8.070000000000000这样然后你再按我的代码,把var a : double;换成var a : Extended;试试,是不是可以加很多的#
      

  8.   

    谢谢dBASEIII(明年毕业了) ,可是如果我希望
    var 
      a:double;
      s:string;
      vADOConnection:Variant;
    begin
      a := 8.07;
      s := formatfloat('#.################',a);//s显示8.07000000000000028
      vADOConnection := CreateOleObject('ADODB.Connection');
      vADOConnection.ConnectionString := 'Driver={Firebird/InterBase(r) driver};pwd=masterkey;Uid=SYSDBA;database=C:\123.GDB';
      try 
        vADOConnection.Open;
      Except
      end;
      a := 8.07;
      s := formatfloat('#.################',a);//s显示8.07
    end;显示8.07的地方也显示8.07000000000000028,意思就是即使错也错的一样!我个人理解,vADOConnection.Open调用了MS的库文件,所以有效位数之后的数字直接删除了。有什么好方法来不删除呢?