create table test(n numeric(9,6),d decimal(28,6),f float(50))
对于float类型没有这个问题,但numeric,decimal都有这个问题。
用ADO连接numeric,decimal会自动变成enable bcd没有这个问题,但只能输入4位小数了。

解决方案 »

  1.   

    使用BDE連接數據庫時碰到過。
    我的解決方案是:
    使用TDataBase控件,在Params中設置:ENABLE BCD=True 在前台自動轉換成Float問題得到解決,但存在問題:1:前台在TDataSet(如TQuery)控件中建立永久性字段時如果包括字段符型(如Varchar型)字段則有可能出錯,所以在設了該屬性時建議不要再使用永久性字段;2:小位數最多隻能輸入四位。
      

  2.   

    我知道Enable BCD没有这个问题,但小数只能输入4位了。
    我要用的是超过4位小数,问题还是没有解决.
      

  3.   

    用ADO就是自动转换成Enable BCD的,最多也隻能輸入四位。
      

  4.   

    建议:
    1.我想你可能用数据敏感控件了吧,如果没用的话可以在显示时用format应该就可以解决了吧
    2.或者用sql去查询时,用数据库自带的类似format的函数来格式化一下
    我没有进行测试,但估计应该可以行的通
      

  5.   

    zgdtxf(zgdtxf): 说话之前建议你动手试验一下好吗?
      

  6.   

    变通的办法
    字段用Longint类型。在DELPHI内做Single与Longint的转换
      

  7.   

    ahjoe(强哥):请问Longint能输入小数吗?
      

  8.   

    ahjoe(强哥):你说话不经过大脑吗?
      

  9.   

    俺以为这不是BDE的错,因为对于SQL Server中你定义的numeric(28, 2)类型,它的存储方式与程序中各种数据类型在内存中的存储方式是不相同的。例如,你无法在Delphi中声明一个宽度为28、小数为2位的数据类型。此外,在程序中,对于给定的数据类型,比如Real,那么它能表示的实数是有限的,也就最多与(2^64)个实数(Real是64bit存储)非常接近,其他的就只能近似了。俺就是这样理解的。因此在定义数据库中的数据类型时,应当考虑尽量与应用程序中的内存存储方式接近,或者尽量提高精度以减少误差。俺相信,浮点计算包括直接赋值,准确是相对的,不准确是绝对的。
    建议参考如下帖子,也许有所启发:
    http://expert.csdn.net/Expert/topic/1563/1563263.xml?temp=.1756708
      

  10.   

    cnsuyong(小可) :你给我看的贴子我看了之后没有任何启发.
    首先我问你:为什么用ODBC就没有这样的问题呢?
    其次用BDE:为什么31.7会在存储后变成31.69999999而32.7就没有任何变化呢?如果你说这不是BDE的错,那你帮我解释一下好吗?
      

  11.   

    采用变体记录
    data: record
      case integer of
        0: (datLong: integer);//4 bytes
        1: (datSingle: single);//4 bytes
    end;
    明显 datLong 与 datSingle 占用相同的空间。Single是可以存小数的。所以如果你不够笨的话现在应该明白如何往longint字段存小数值了。
      

  12.   

    >>为什么31.7会在存储后变成31.69999999而32.7就没有任何变化呢?这是浮点数精度问题。如果你觉得你的程序不允许这么大的误差,你可以使用更高精度的浮点类型。如果你的程序实际应用中不会出现这么多小数位数,你也可以从数据库读出数值后做4舍5入的处理。
      

  13.   

    ahjoe(强哥)那我再问你:31.6999999应该判定为31.67还是31.7还是31.667还是31.6667还是............怎么判定,高人呀!你怎么判定呢????????????
      

  14.   

    定义浮点形变量的时候,注意精度用Extended,我就是怎么解决的
      

  15.   

    你要先确定你的程序支持的精度。然后决定使用什么精度的浮点型。在转的时候就依照你的精度来转。
    比如你决定程序最多支持5位小数,那就把 31.69999999转成 31.70000,去掉末尾的0得到31.7。如果你不确定你的程序的小数精度,那就不好办了。当然也可以用楼上师兄的办法。用Extended类型,它占10个字节. 我不是高人,不知道Extended在SQL中对应的类型是什么。
      

  16.   

    TO:ahjoe(强哥)、glassesboy(glassesboy) 你们两个家伙连问题都没有搞清楚居然还能说这么多,我简直佩服你们两个。预练次功必先自宫,
    即使自宫未必成功,
    若不自宫也可成功。
    哈哈.............
      

  17.   

    erp2(天涯劍) :你真的很过分,怎么这么跟人说话的?你仔细看看自己的发言,或许可以在认识自身素质上有所启发。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————