代码之家  ›  专栏  ›  技术社区  ›  kaptan

SQL Server“money”数据类型是十进制浮点还是二进制浮点?

  •  14
  • kaptan  · 技术社区  · 16 年前

    我找不到任何拒绝或确认SQL Server“money”数据类型是十进制浮点还是二进制浮点的内容。

    在描述中,它表示货币类型的范围是从-2^63到2^63-1,所以这种类型意味着它应该是一个二进制浮点。

    但关于 this page 它将货币列为“精确”数字。哪种货币可能是小数点(否则它的精确性如何?)或者确切的定义是什么?

    那么,如果货币是一个十进制的浮点数,那么货币和十进制(19,4)之间的差额是多少?

    3 回复  |  直到 16 年前
        1
  •  25
  •   hobodave    16 年前

    两者都不。如果它是浮点型的实现,那么它将受到与浮点型和实型相同的不精确性的影响。见 Floating Point 在维基百科上。

    金钱是一种 fixed point 类型。

    它比十进制(19,4)小一个字节,因为它的范围较小(922337203685477.5808到922337203685477.5807),而不是(-10^15+1到10^15-1)。

        2
  •  10
  •   Mark Byers    16 年前

    要了解这些差异,我们可以查看文档:

    文件 money 以下内容:

    Data type  Range                                                 Storage
    money      -922,337,203,685,477.5808 to 922,337,203,685,477.5807 8 bytes
    smallmoney -214,748.3648 to 214,748.3647                         4 bytes
    

    money和smallmoney数据类型精确到它们所代表的货币单位的千分之一。

    比较 decimal :

    使用最大精度时,有效值为-10^38+1到10^38-1。

    Precision    Storage
    1 - 9        5 bytes
    10 - 19      9 bytes
    20 - 28      13 bytes
    29 - 38      17 bytes
    

    所以它们并不完全相同,只是相似。小数(19,4)的范围略大于货币(它可以存储在-10^15+0.0001到10^15-0.0001之间),但也需要多存储一个字节。

    换句话说,这项工作:

    CREATE TABLE Table1 (test DECIMAL(19,4) NOT NULL);
    INSERT INTO Table1 (test) VALUES
    (999999999999999.9999);
    SELECT * FROM Table1 
    
    999999999999999.9999
    

    但这并不是:

    CREATE TABLE Table1 (test MONEY NOT NULL);
    INSERT INTO Table1 (test) VALUES
    (999999999999999.9999);
    SELECT * FROM Table1 
    
    Arithmetic overflow error converting numeric to data type money.
    

    还有语义上的差异。如果您想要存储货币值,那么使用类型money是有意义的。

        3
  •  3
  •   Dancrumb    16 年前

    我认为主要的区别是所需的存储空间。

    DECIMAL(19,4) 需要9个存储字节

    MONEY 需要8个存储字节

    推荐文章