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)之间有什么区别?
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和smallmoney数据类型精确到它们所代表的货币单位的万分之一.
与十进制比较:
使用最大精度时,有效值为-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)
还有语义差异.如果你想存储货币价值,那么使用类型货币是有意义的.