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

kap*_*tan 14 sql-server floating-point currency decimal

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

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

但在此页面上,它将MONEY列为"精确"数字.哪种情况表明MONEY可能是十进制浮点数(否则它是如何精确的?或者究竟是什么定义?)

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

hob*_*ave 25

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

MONEY是固定点类型.

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


Mar*_*ers 10

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

资金文件:

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
Run Code Online (Sandbox Code Playgroud)

money和s​​mallmoney数据类型精确到它们所代表的货币单位的万分之一.

十进制比较:

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

Precision    Storage
1 - 9        5 bytes
10 - 19      9 bytes
20 - 28      13 bytes
29 - 38      17 bytes
Run Code Online (Sandbox Code Playgroud)

所以它们并不完全相同,只是相似.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
Run Code Online (Sandbox Code Playgroud)

但这不是:

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.
Run Code Online (Sandbox Code Playgroud)

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

  • @Farzad:你有没有尝试过你刚才声称的可能? (2认同)