Является ли тип данных SQL Server «ДЕНЬГИ» десятичной с плавающей запятой или двоичной с плавающей запятой? - PullRequest
14 голосов
/ 22 февраля 2010

Я не смог найти ничего, что отклоняет или подтверждает, является ли тип данных SQL Server 'MONEY' десятичной или двоичной плавающей точкой.

В описании говорится, что диапазон типа MONEY составляет от -2 ^ 63 до 2 ^ 63 - 1, поэтому этот тип подразумевает, что это должна быть двоичная плавающая точка.

Но на этой странице она перечисляет ДЕНЬГИ как "точное" число. Какой тип предполагает, что ДЕНЬГИ могут быть десятичной плавающей запятой (иначе как это точно? Или каково определение точного?)

Тогда, если ДЕНЬГИ - это десятичное число с плавающей запятой, то в чем разница между ДЕНЬГАМИ и ДЕСЯТИЧНЫМИ (19,4)?

Ответы [ 3 ]

25 голосов
/ 22 февраля 2010

Ни. Если бы это была реализация с плавающей запятой, она была бы подвержена тем же неточностям, что и типы FLOAT и REAL. См. Плавающая точка в Википедии.

ДЕНЬГИ - это тип с фиксированной точкой .

Это на один байт меньше, чем DECIMAL (19,4), потому что он имеет меньший диапазон (922,337,203,685,477.5808 до 922,337,203,685,477.5807) по сравнению с (-10 ^ 15 + 1 до 10 ^ 15-1).

10 голосов
/ 22 февраля 2010

Чтобы увидеть различия, мы можем посмотреть в документации:

Документация для денег :

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 с точностью до десятитысячной доли денежных единиц, которые они представляют.

Сравнить с десятичным :

При использовании максимальной точности действительные значения находятся в диапазоне от -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.

Есть также семантическая разница. Если вы хотите хранить денежные значения, имеет смысл использовать тип money.

3 голосов
/ 22 февраля 2010

Я думаю, что основным отличием будет необходимое место для хранения.

DECIMAL(19,4) потребуется 9 байтов хранения

MONEY потребуется 8 байтов хранения

...