Sql server 是SQL Server';货币';数据类型是十进制浮点还是二进制浮点?

Sql server 是SQL Server';货币';数据类型是十进制浮点还是二进制浮点?,sql-server,floating-point,decimal,currency,Sql Server,Floating Point,Decimal,Currency,我找不到任何拒绝或确认SQL Server“MONEY”数据类型是十进制浮点还是二进制浮点的内容 在描述中,它说货币类型的范围是从-2^63到2^63-1,所以这类表示它应该是一个二进制浮点 但上面的钱是“精确”数字。哪一种暗示货币可能是十进制浮点数(否则它是如何精确的?或者精确的定义是什么?) 那么,如果货币是十进制浮点,那么货币和十进制(19,4)之间的区别是什么?我认为主要的区别将是所需的存储空间 十进制(19,4)需要9个存储字节 货币都不需要8个存储字节。如果它是浮点的实现,它将受到与

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

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

但上面的钱是“精确”数字。哪一种暗示货币可能是十进制浮点数(否则它是如何精确的?或者精确的定义是什么?)


那么,如果货币是十进制浮点,那么货币和十进制(19,4)之间的区别是什么?

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

十进制(19,4)
需要9个存储字节


货币
都不需要8个存储字节。如果它是浮点的实现,它将受到与浮点和实数类型相同的不精确性的影响。见维基百科

钱是一种类型


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

要了解区别,我们可以查看文档:

文件:

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
所以它们并不完全相同,只是相似而已。小数(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类型是有意义的。

您确定十进制需要额外的一个字节来存储刻度吗?它不是作为列类型的一部分存储的吗?@Mark:嗯,我明白你的意思,但它必须用来存储一些东西,对吗?要么是精度,要么是比例。@hobodave:我想我做到了。。。你可以读我的答案,但它被否决了,所以可能是错的?(如果向下投票的人说为什么会这样就好了!)是的,我没有注意到它实际上是一个固定点,我想我们可以说它是十进制的固定点。你劫持了我的答案,让它更华丽了-Ptnx是写出来的,但关键是钱是固定的,这使它成为一个完全不同的野兽。@Farzad:不,它不是一个完全不同的野兽。十进制也是定点。这两种类型的比例都是固定的,但对于十进制类型,您可以选择固定的比例,但是对于货币,您不能选择固定的比例。@Mark:没有十进制是十进制浮点。正如你在描述中看到的:s(缩放)最大值是坏的。你说得对。我错误地认为sql decimal与.net decimal相同。看起来就像你说的sql十进制也是定点的!
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.