有关数据类型问题。
问题如下:现在设计SQL Server数据库,设计结构时为Decimal(18,12)。
但是在Delphi读该字段的数据,但是不管用什么方法读,读出来都是为4小数。
要的是12位小数,怎么也出不来,怎么办呢?我用Float型也试了试但,是不知道为什么么,老是不准确,插入时的数值为:6.6666666,但数据库存为:6.666669999999993。这又是为什么?请帮忙解答?????谢谢!!!!
使用的是为:TADOQuery,都是用参数化操作。不管是更新,插入,还是读出都是为四位小数,当用Decimal(18,12)。我的要求数据一定要准确,这怎么解决呢?是Delphi的问题吗?还是Delphi的Bug!!!!

解决方案 »

  1.   

    这是数据库的问题,好像没办法的,你试试改为Decimal(18,6)。
      

  2.   

    用BDE/IDAPI时会有这种情况;
    换成ADO看一看;
    再者,你的Decimal(18,12)确定无错?:)
    --------------------------------------------------------------------
    招聘斑竹我们可以一起交流;
    呵呵
    www.nxrs.net/bbs
    谢谢,别抛砖
      

  3.   

    如果是用BDE联接的话将对就的DBE中的ENABLE BCD的属性设置为true;
      

  4.   

    不行,我现在用的是ADO,已经试了好几种方法都不行,刚才我读数据时也同样发现该问题,
    请看看:
        Data_1 : real;
        Data_2 : Extended ;    ADOQuery1.SQL.Text := 'select * from f_exam where Super_ID=''1''';
        ADOQuery1.Open ;
        data_1 := ADOQuery1.fieldByName('superdata_1').asFloat;
        Data_2 :=ADOQuery1.fieldByName('superdata_1').AsVariant   ;
        listbox1.Items.Add(floattostr(data_1));
        listbox1.Items.Add(floattostr(data_2));
    结果呢:Data_1和Data_2的数据均为四为小数。
    下面是为写:
    var
        f_SQLString:string;
    begin
        with TADOQuery.Create(nil) do
        begin
            try
                Connection := dmMainADO.ADOConnectMain ;
                f_SQLString := 'insert into f_exam(Super_ID, SuperData_1, SuperData_2,' +
                            'SuperDate_3, SuperData_4)values(:Super_ID, :SuperData_1, :SuperData_2,' +
                            ':SuperDate_3, :SuperData_4)';
                sQL.Text :=f_SQLString;
                Parameters[1].DataType := ftfloat;
                Parameters[4].DataType := ftfloat;
                Parameters.ParamByName('Super_ID').Value := '7';
                Parameters.ParamByName('SuperData_1').Value := 4.2344444411;
                Parameters.ParamByName('SuperData_2').Value := 4.555555555;
                Parameters.ParamByName('SuperDate_3').Value := 6.6666666;
                Parameters.ParamByName('SuperData_4').Value := 7.69666666;
                ExecSQL;
            finally
                Free;
            end;
        end;
    结果写进去的都为四位小数。
    对于用ftBCD,我也用过,但是仍然是四位。数据库设计没有问题。