我找不到任何拒绝或确认SQL Server'EYEY'数据类型是十进制浮点数还是二进制浮点数的内容。
在描述中它说MONEY类型范围是-2 ^ 63到2 ^ 63 - 1所以这种意味着它应该是一个二进制浮点。
但在this page上,它将MONEY列为“精确”数字。哪种情况表明MONEY可能是十进制浮点数(否则它是如何确切的?或者究竟是什么定义?)
那么如果MONEY是十进制浮点数,那么MONEY和DECIMAL(19,4)之间有什么区别?
答案 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和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
所以他们并不完全相同,只是相似。 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个存储字节