var d1,d2:real;
begin
d1:=11;d2:=1.2;
form1.caption:=floattostr(d1*d2-13.2);   //本该为0,可是却只是无限接近于0的数值....这里  不存在复杂的循环,为何不能计算正确呢? 你看能delphi显示正确结果吗 ?
  我没怎么用delphi,可是想试验一下,就发现这样,我是否该去领奖呢?:)                     http://kj88.com

解决方案 »

  1.   

    你这样用,可以提高精度
    var d1,d2:Extended;
    begin
    d1:=11;d2:=1.2;
    form1.caption:=floattostr(d1*d2-13.2);   //本该为0,可是却只是无限接近于0的数值....这里  不存在复但是....但是...无论你用c也好,c++也好,java,c# 还有xXXXX语言,都有精度问题,与delphi无关.不要有的放矢哈
      

  2.   

    正常的,因为你用的是real类型。
      

  3.   

    定义成Currency不会哦``procedure TForm1.Button1Click(Sender: TObject);
    var d1,d2,d3:Currency;
    begin
      d1:=11;
      d2:=1.2;
      edit1.Text :=currtostr(d1*d2);
      d3 :=d1*d2;
      edit2.Text :=CurrToStr(d3-13.2);end;
      

  4.   

    很正常的现象,对于计算机而言,没有什么相等的问题,只是精度的问题。所以牵涉到浮点数的比较不要使用'=',而要给定一个精度。if abs(a-b)<0.00000001 then showmessage('a equal b');
      

  5.   

    浮点数运算都是这样的
    不是语言的问题
    CPU就是这样的~
      

  6.   

    那么delphi对于大数字计算该用什么类型合适呢
      

  7.   

    "那么delphi对于大数字计算该用什么类型合适呢"
     
    大数字,有多大?整数还是浮点数?
    要是进行某些类似RSA的整数运算,你最好自己定义一个类。
      

  8.   

    "那么delphi对于大数字计算该用什么类型合适呢"
     
    大数字,有多大?整数还是浮点数?
    要是进行某些类似RSA的整数运算,你最好自己定义一个类。
    其中的数字都使用字符来表示。
      

  9.   

    正常的,因为你用的是Real类型,所有语言中的浮点数都有这样的问题。
    如果你不希望出现这样的问题,可以使用Currency类型,如果Currency类型表示的范围你还不满意的话,DELPHI支持BCD,你可以用BCD数据类型,应该够你用了吧。
      

  10.   

    这不是Bug;不是delphi的问题,你本身就不应该对浮点数用等号来判断;这是常识
    记住一点,所有浮点数都是近似值;这个和内部处理有关;
    你要的是百分之百的精确,而浮点数只能做到99%的精确。如果你不注意,万一那次让你碰到1%的不精确,你不就惨了;至于这样的判断怎么处理;楼上hxfjb(New人)已经说了一些.你还可以用if A-B < 0.001 then 这样的形式判断.
      

  11.   

    浮点数的精度控制问题
    我们在教科书上经常看到,想判断两个浮点数是否相等,往往不能直接用 == 判断。这是因为浮点数的运算经常有误差,导致结果有细小的误差,在判断相等时需要忽略这些误差。比如判断 a==b 经常被写作 fabs(a-b)<0.00001 这样的形式。 其实,这里可以用更高效率的方式,即直接降低精度,只需要做一个 & 操作就可以了。 比如想对 double f 降低精度,只需要做 *((__int64*)&f)&=~0xf; 0xf 是可调整的,这一句就是把底数最后几位清为 0 而已。 x86 用的浮点数是 IEEE 754 标准. 一个 double 有 64 bit. 最高一个 bit 是符号位. (浮点数的正负不是用补码表示的) 低 52 [0,51] bits 是底数, 所有的浮点数都是 1.xxxxxx * 2^n 表示的. 这个 xxxxx 就是底数.1 是省略不写的. [52,62] 表示的这个 n, 也就是指数. 这个 n 有 11 bits, 是用移码表示的. 为什么用移码? 因为最终想用 8 字节的 0 表示浮点数的 0. 而且可以直接用整数的大小比较, 比较浮点数. 11 bits 的 0 表示的是负无穷, 0 其实是用 1*2^(-无穷大) 表示出来的。
      

  12.   

    你如果不能理解浮点的原理以及运算机制的话,
    "delphi数值计算的重大隐患bug"这个桂冠可能就要属于你了*_*
      

  13.   

    不是不能理解,本人曾用移位指令实现所有类型数值的数学计算,当然用到精确度比较了.然而我问的问题请大家仔细看,不要理解偏了,重申:
    var d1,d2:real;
    begin
    d1:=11;d2:=1.2;
    form1.caption:=floattostr(d1*d2-13.2); //显示不符合要求但是
    var d1,d2:real;
    begin
    d1:=11;d2:=1.1;
    form1.caption:=floattostr(d1*d2-13.2); //显示符合要求注意:d1*d2=13.2的时候才出错,其他正常!!!!!!!!
    让大家解释的就是为什么相等时候就不正常了呢???????其他均正常!!!!!并非什么情况都不能比较!
      

  14.   

    无论怎样计算,其实还是在内寸单元的内容比较...........总不会无法判断是否和自己一样吧?如果这样的都不能做,delphi的问题(水平)实在让人难以恭为!
      

  15.   

    〉〉d1:=11;d2:=1.1;form1.caption:=floattostr(d1*d2-13.2); //显示符合要求
    这个原因就不用我说了吧:)