var
  TmpScript: String;
  Result: Double;
begin
1:  TmpScript := 'begin' + #13#10 +
                 'result := 600+0+0+0+0+0+0+0-0+0+0+0+0+0-600-0' + #13#10 +
                 'end;';2:  TmpScript := 'begin' + #13#10 +
                 'result := 482.14+0+0+0+0+0+800+0-0+0+0+0+0+0-482.14-800' + #13#10 +
                 'end;';  Result := Double(RunScript(TmpScript)); //RunScript()返回类型为Variant。
end;
脚本计算结果同样都是0为什么第一个返回:0;而第二个返回: -1.13686837721616E-13;
我靠,都快疯了。这是delphi6的毛病吗?有高手能解决吗?不胜感激。

解决方案 »

  1.   

    RunScript是什么方法?在哪里定义的?
      

  2.   

    楼主是在数据库端执行的代码?
    浮点数不是一个有精度等级的数据类型,分为整部份与小数部份,实际上,对于浮点数的运算,对其结果,你只能有一个精度等级.
    对于第一个SQL脚本,是一个整数运算,返回的当然是0
    对于第二个SQL脚本,是浮点运算在内,返回的数据是有精度等级的,事实上,返回的数据是:-1.13686837721616E-13
    也就是:  -0.000000000000011268683372...也就是说返回一个很高精度的很小的浮点数.
    如果要判断浮点数是否为0.你不能直接用浮点数来与0比较.而是要与一个精度等级进行比较.这些东西,是书本上反复上讲的了.if abs(-1.13686837721616E-13)<=0.0000000001 then
      showmessage('result is zero')
      

  3.   

    这个呢我想和浮点数的表示有关
    482.14+0+0+0+0+0+800+0-0+0+0+0+0+0-482.14-800
    这个也就是482.14+800+482.14-800
    这个看起来要等于0
    但是在计算机中表示的浮点数分为两部分
    一部分表示有效位,以部分表示数量级一般是2,4,8,16,的n次平方
    为了研究方便假设这个浮点数是8位的
    我定义这个8位的
    第一位表示符号,如果是1表示负数,0表示整数
    接下来3位表示有效位,表示有效数据
    接下来1位表示数量级的符号
    最后三位表示数量级底数为2
    那么我的这个结构最表示最大的数是
    (01110111)f = (111)B = 7
    表示的最小的数是
    (11110111)f = -(111)B = -7
    表示最小正数是
    (00011111)f = (0.000001)B = 0.0078125如果要是进行你上面的运算
    那么比如是
    1.75 + 3 - 3 - 1.75 
    那么我们看看电脑是如何表示的
    (1.75)d = (01110001)f
    (3)d = (01100011)f
    1.75和3相加的时候不是像我们看到的二进制一样相加
    他们首先要弄成是数量级相同,然后相加,然后整合数据1.75可以表示成0.111 * 11^1
    3 表示成   0.11 * 11^11
    那么然三变一下成为
    1.1 * 11^1
    那么就和1.75表示相同了
    然后相加变成
    10.011 * 11^1
    最后整合成
    0.100 * ^11^111
    也就是(01010111)f
    然后减去3变成
    (01000001)f
    然后在减去1.75
    就变成(11100000)f  = - 0.75
    这个大致计算机中表示浮点数就是这么表示的
    计算机是用二进制表示浮点数的,表示能力有限,所以会造成上面的的结果
      

  4.   

    各位分析了原因,但是没有给出一个合理的解决办法。如果判断它小于某个数,我觉得并不太好。我想用“currency类型”也就是货币类型来进行运算,不知道可不可以。各位有什么看法?
      

  5.   

    就是精度问题,判断两个浮点数相等的问题都要用一个精度进行。精度多少自己设置.
    if (result)<0.000000001 then 记过为零