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

时间:2010-02-22 20:23:47

标签: sql-server floating-point decimal currency

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

在描述中它说MONEY类型范围是-2 ^ 63到2 ^ 63 - 1所以这种意味着它应该是一个二进制浮点。

但在this page上,它将MONEY列为“精确”数字。哪种情况表明MONEY可能是十进制浮点数(否则它是如何确切的?或者究竟是什么定义?)

那么如果MONEY是十进制浮点数,那么MONEY和DECIMAL(19,4)之间有什么区别?

3 个答案:

答案 0 :(得分:25)

都不是。如果它是浮点的实现,它将受到与FLOAT和REAL类型相同的不准确性。请参阅维基百科上的Floating Point

MONEY是fixed point类型。

它比DECIMAL(19,4)小一个字节,因为它的范围较小(922,337,203,685,477.5808到922,337,203,685,477.5807),而不是(-10 ^ 15 + 1到10 ^ 15-1)。

答案 1 :(得分:10)

要查看差异,我们可以查看文档:

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和s​​mallmoney数据类型精确到它们所代表的货币单位的万分之一。

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

所以他们并不完全相同,只是相似。 DECIMAL(19,4)的范围略大于MONEY(它可以存储-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.

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

答案 2 :(得分:3)

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

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

MONEY将需要8个存储字节