问题如下:
var
  sum: Extended;
begin  
  sum := 0.0;
  sum := sum + table1.FieldByName('aaa').AsFloat / (1 - table2.FieldByName('bbb').AsFloat / 100) * 3000;
end;代入数值也就是:
sum := 0.0 + 0.52269 / (1 - 2 / 100) * 30000;
实际用系统自带的计算器得到的值是:16000.714285714285714285714285714
可是在程序里面就变成只有6位小数位了,也就是16000.714286
我的数据集里面的字段是保留的6位小数,不会计算过后也是按6位来截取吧?这样算的话我后面那么多小数位全丢了,就不准确了,变量sum我用Real型也是这样,Extended类型不是可以保留19-20位小数吗?怎么会这样呢?各位大哥,有没有遇到过?怎么解决呀?

解决方案 »

  1.   

    另外我这样试过:
    直接把数值代入程序里,也就是把:
    sum := sum + table1.FieldByName('aaa').AsFloat / (1 - table2.FieldByName('bbb').AsFloat / 100) * 3000;
    换成:
    sum := 0.0 + 0.52269 / (1 - 2 / 100) * 30000;
    结果会是科学计数法表示的值,为什么我用数据集字段的值来算,就自动给我截掉了呢?
      

  2.   

    另外real这些类型是带精度的也就是说是不精确的,integer是没有精度的所以是精确的
      

  3.   

    关键是在程序里面计算后sum的值就只有6位了
    是这样子的,用下面的代码计算:
    var
      sum: Extended;
    begin  
      sum := 0.0;
      sum := sum + table1.FieldByName('aaa').AsFloat / (1 - table2.FieldByName('bbb').AsFloat / 100) * 3000;
    end;
    其中:
    table1.FieldByName('aaa').AsFloat = 0.52269
    table2.FieldByName('bbb').AsFloat = 2
    最后结果是:16000.714286可是我用计算器算:0.52269 / (1 - 2 / 100) * 3000;
    结果就是:16000.714285714285714285714285714现在我的意思就是:程序里面算的它自动给我把后面的截掉了,怎么让系统不要截掉后面的数据啊?我用了下面的方法:
    1、把数据集里面字段的精确改成38位30位小数再用上面的代码计算;
    2、用一个Extended类型(该类型可以精确到19-20位小数)的变量,把0.52269赋给它,然后再用这个变量来参与计算,sum也是Extended类型;
    3、用RoundTo(结果,-10)来取小数位这几种方法都试了,都不行,还是原来的6位不变。怎么回事呀?高手们求救!!!
      

  4.   

    把对应的数据集的EnableBCD属性设置为false,再重新加入数据字段就可以了
      

  5.   

    没遇到过,也许是delphi类型的bug
      

  6.   

    数据集的EnableBCD属性已经设置为false了,为True的话就只有4位小数,现在有6位了,现在是计算过后的值Sum有问题,它是个变量啊,我又没有给它定义小数位,为什么它自己截了只有6位了呢?