Выбор подходящей точности для десятичного числа (x, y) - PullRequest
1 голос
/ 30 апреля 2009

В настоящее время я перерабатываю устаревшую базу данных для работы на SQL Server 2005 и хочу заменить большинство старых столбцов с плавающей запятой на десятичные.

Десятичной дроби (15,4) будет достаточно для моих нужд, но документ SQL Server заявляет, что для этого потребуется то же пространство памяти (9 байт), что и для десятичной (19,4). Наличие большего числа в одном и том же месте для хранения кажется хорошей идеей. Итак: есть ли причина, по которой я должен не использовать максимальную точность (19,4)? Возможно, недостатки в производительности? Имейте в виду, что я не буду делать обширные вычисления в базе данных, только некоторые суммы или умножения в запросах.

Ответы [ 3 ]

4 голосов
/ 30 апреля 2009

Основная причина использования меньшей точности данных, несмотря на то, что используется тот же объем памяти, заключается в том, чтобы донести смысл до будущих пользователей системы. Вот почему так важно использовать соответствующие типы данных - например, DECIMAL (15,4) за номера, ДЕНЬГИ за деньги.

2 голосов
/ 30 апреля 2009

Для 4 десятичных знаков используйте деньги, если можете

Причина: она быстрее десятичной, но точна

Деньги, число с плавающей запятой, десятичное число артикул

Редактировать: на основе комментария

Интересный аргумент. Я слежу за обоими блогами.

Обратите внимание на приведенные здесь примеры: различная точность в зависимости от типов данных и приоритета

declare @d decimal(19,4), @ddiv decimal(19,4)

set @d = 12.39
SET @ddiv = 1000

select (@d/@ddiv)*@ddiv, (@d/1000)*1000
--Gives   12.390000    12.390000000

Объясняется моим ответом здесь: " Точность десятичного деления T-SQL "

Теперь это интересно. Десятичные, разные ответы

declare @d decimal(19,4), @ddiv decimal(19,4)

set @d = 12.39
SET @ddiv = 1001

select (@d/@ddiv)*@ddiv, (@d/1001)*1001
--Gives   12.390000    12.389999622

Вернуться к деньгам: один и тот же ответ для каждого

declare @d money, @ddiv money

set @d = 12.39
SET @ddiv = 1001

select (@d/@ddiv)*@ddiv, (@d/1001)*1001
--Gives   12.3123    12.3123

Мораль: хранить в SQL, обрабатывать на клиентских языках ...

0 голосов
/ 09 декабря 2014

С точки зрения производительности, нет причин не использовать десятичную дробь (19,4). Лично я не думаю, что использование другой точности только для «передачи смысла» имеет смысл не только потому, что надлежащая документация (даже комментарий к полю) позаботится об этом, но особенно потому, что бизнес-правила действительно меняются.

Если вместо этого вы предпочитаете использовать ДЕНЬГИ, помните о возможных ошибках точности: https://groups.google.com/forum/?hl=en#!topic/microsoft.public.sqlserver.server/4ZvwaOII3Vs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...