Действительно ли 'ДЕНЕЖНЫЙ' тип данных SQL Server является десятичной или двоичной плавающей точкой с плавающей точкой?

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

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

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

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

14
задан John Saunders 22 February 2010 в 21:00
поделиться

3 ответа

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

MONEY - это тип с фиксированной точкой.

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

25
ответ дан 1 December 2019 в 07:12
поделиться

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

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

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

-121--2439227-

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

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

Это один байт меньше, чем ДЕСЯТИЧНЫЙ (19,4), потому что он имеет меньший диапазон (922 337 203 485 477,5808 до 922 337 203 685 477,5807) в отличие от (-10 ^ 15 + 1 до 10 ^ 15-1).

-121--2439225-

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

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

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

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

10
ответ дан 1 December 2019 в 07:12
поделиться

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

DECIMAL(19,4) потребует 9 байт памяти

MONEY потребует 8 байт памяти

3
ответ дан 1 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: