Являются ли данные SQL Server "MONEY" десятичной плавающей точкой или двоичной с плавающей запятой?
Я не мог найти ничего, что отклоняло бы или подтверждало бы, является ли тип данных "ДЕНЬГИ" SQL Server десятичной плавающей точкой или двойной плавающей точкой.
В описании говорится, что диапазон типа MONEY составляет от -2 ^ 63 до 2 ^ 63 - 1, поэтому этот тип подразумевает, что он должен быть двоичной с плавающей запятой.
Но на этой странице он перечисляет MONEY как "точный" числовой. Какой тип предполагает, что ДЕНЬГИ может быть десятичной плавающей точкой (иначе как это точно? Или что такое определение точного?)
Тогда, если MONEY является десятичной плавающей точкой, то в чем разница между MONEY и DECIMAL (19,4)?
Ответы
Ответ 1
Ни. Если бы это была реализация с плавающей запятой, она была бы подвержена тем же неточностям, что и типы FLOAT и REAL. См. Плавающая точка в википедии.
MONEY - это тип фиксированной точки.
Он на один байт меньше, чем DECIMAL (19,4), поскольку он имеет меньший диапазон (922,337,203,685,477,5808 - 922,337,203,685,477.5807) в отличие от (-10 ^ 15 + 1 до 10 ^ 15-1).
Ответ 2
Чтобы увидеть различия, мы можем посмотреть документацию:
Документация для деньги:
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 and 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
Таким образом, они не совсем эквивалентны, просто похожи. A 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.
Там также семантическая разница. Если вы хотите хранить денежные значения, имеет смысл использовать деньги типа.
Ответ 3
Я думаю, что основное различие будет занимать место хранения.
DECIMAL(19,4)
потребуется 9 байтов хранения
MONEY
потребуется 8 байтов хранения