Sql

Decimal sql: decimal и numeric (Transact-SQL) — SQL Server

(76 — S) )

Например, Decimal32(4) содержит числа от -99999.9999 до 99999.9999 c шагом 0.0001.

Содержание

Внутреннее представление​

Внутри данные представляются как знаковые целые числа, соответсвующей разрядности. Реальные диапазоны, хранящиеся в ячейках памяти несколько больше заявленных. Заявленные диапазоны Decimal проверяются только при вводе числа из строкового представления. Поскольку современные CPU не поддерживают 128-битные числа, операции над Decimal128 эмулируются программно. Decimal128 работает в разы медленней чем Decimal32/Decimal64.

Операции и типы результата​

Результат операции между двумя Decimal расширяется до большего типа (независимо от порядка аргументов).

  • Decimal64(S1) <op> Decimal32(S2) -> Decimal64(S)
  • Decimal128(S1) <op> Decimal32(S2) -> Decimal128(S)
  • Decimal128(S1) <op> Decimal64(S2) -> Decimal128(S)
  • Decimal256(S1) <op> Decimal<32|64|128>(S2) -> Decimal256(S)

Для размера дробной части (scale) результата действуют следующие правила:

  • сложение, вычитание: S = max(S1, S2).
  • умножение: S = S1 + S2.
  • деление: S = S1.

При операциях между Decimal и целыми числами результатом является Decimal, аналогичный аргументу.

Операции между Decimal и Float32/64 не определены. Для осуществления таких операций нужно явно привести один из аргументов функциями: toDecimal32, toDecimal64, toDecimal128, или toFloat32, toFloat64. Это сделано из двух соображений. Во-первых, результат операции будет с потерей точности. Во-вторых, преобразование типа — дорогая операция, из-за ее наличия пользовательский запрос может работать в несколько раз дольше.

Часть функций над Decimal возвращают Float64 (например, var, stddev). Для некоторых из них промежуточные операции проходят в Decimal. Для таких функций результат над одинаковыми данными во Float64 и Decimal может отличаться, несмотря на одинаковый тип результата.

Проверка переполнений​

При выполнении операций над типом Decimal могут происходить целочисленные переполнения. Лишняя дробная часть отбрасывается (не округляется). Лишняя целочисленная часть приводит к исключению.

SELECT toDecimal32(2, 4) AS x, x / 3
┌──────x─┬─divide(toDecimal32(2, 4), 3)─┐
│ 2.0000 │ 0.6666 │
└────────┴──────────────────────────────┘
SELECT toDecimal32(4.2, 8) AS x, x * x
DB::Exception: Scale is out of bounds.
SELECT toDecimal32(4.2, 8) AS x, 6 * x
DB::Exception: Decimal math overflow.

Проверка переполнения приводит к замедлению операций. При уверенности, что типа результата хватит для его записи проверку переполнения можно отключить настройкой decimal_check_overflow. В этом случае при переполнении вернется неверное значение:

SET decimal_check_overflow = 0;
SELECT toDecimal32(4.2, 8) AS x, 6 * x
┌──────────x─┬─multiply(6, toDecimal32(4.2, 8))─┐
│ 4.20000000 │ -17.74967296 │
└────────────┴──────────────────────────────────┘

Переполнения происходят не только на арифметических операциях, но и на операциях сравнения. Отключать проверку стоит только при полной уверенности в корректности результата:

SELECT toDecimal32(1, 8) < 100
DB::Exception: Can't compare.

Смотрите также

  • isDecimalOverflow
  • countDigits

Функция SQL Server ROUND()

❮ Предыдущая ❮ Функции SQL-сервера Далее ❯

Пример

Округлить число до 2 знаков после запятой:

SELECT ROUND(235.415, 2) AS RoundValue;

Попробуйте сами »


Определение и использование

Функция ОКРУГЛ() округляет число до указанного количества знаков после запятой.

Совет: Также посмотрите на FLOOR() и ПОТОЛОК().

Синтаксис

ОКРУГЛ( номер , десятичные числа , операция )

Значения параметров

Параметр Описание
номер Обязательно. Число, подлежащее округлению
десятичные дроби Обязательно. Количество знаков после запятой для округления числа от до
операция Дополнительно. Если 0, результат округляется до числа 9.0024 десятичное число . Если значение, отличное от 0, усекает результат до числа десятичные дроби. Значение по умолчанию: 0

Технические детали

Работает в: SQL Server (начиная с 2008 г.), база данных SQL Azure, данные SQL Azure Склад, параллельное хранилище данных

Другие примеры

Пример

Округлите число до 2 знаков после запятой, а также используйте операцию параметр:

SELECT ROUND(235.415, 2, 1) AS RoundValue;

Попробуйте сами »

Пример

Округлите число до -1 десятичного знака:

SELECT ROUND(235. 415, -1) AS RoundValue;

Попробуйте сами »

❮ Предыдущая ❮ Функции SQL-сервера Следующий ❯


ВЫБОР ЦВЕТА



Лучшие учебники
Учебник HTML
Учебник CSS
Учебник JavaScript
Учебник How To
Учебник SQL
Учебник по Python
Учебник по W3.CSS
Учебник по Bootstrap
Учебник по PHP
Учебник по Java
Учебник по C++
Учебник по jQuery

Лучшие ссылки
Справочник по HTML
Справочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3.CSS
Справочник по Bootstrap
Справочник по PHP
Цвета HTML
Справочник по Java
Справочник по Angular
Справочник по jQuery

Top6s Examples Примеры HTML
Примеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3.CSS
Примеры Bootstrap
Примеры PHP
Примеры Java
Примеры XML
Примеры jQuery

FORUM 90 | О

W3Schools оптимизирован для обучения и обучения. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего содержания. Используя W3Schools, вы соглашаетесь прочитать и принять наши условия использования, куки-файлы и политика конфиденциальности.

Copyright 1999-2022 Refsnes Data. Все права защищены.
W3Schools работает на основе W3.CSS.

SQL Server DECIMAL: все, что вам нужно знать

Время чтения: 7 минут

Тип данных SQL Server DECIMAL — это очень распространенный тип данных, который вы будете использовать в своей карьере специалиста по базам данных. Вам важно знать, как он работает и правила его настройки.

DECIMAL, конечно же, идеально подходит для хранения числа с десятичными цифрами. SQL Server дает вам возможность указать сколько десятичных цифр должно храниться для вашего номера. Это дает вам контроль над тем, сколько места в памяти занимает ваш номер.

Вам нужно знать, как работает тип данных SQL Server DECIMAL? Вы пришли в нужное место!

Тип данных DECIMAL представлен в следующем БЕСПЛАТНОМ руководстве :

БЕСПЛАТНО на 1 странице руководства по 10 основным типам данных, которые вам нужно знать!

Вам обязательно следует загрузить это руководство, если вам нужно узнать о других очень распространенных типах данных, с которыми вы столкнетесь как специалист по базам данных. Это руководство станет для вас отличным ресурсом, на который можно ссылаться в ходе вашей карьеры. Скачайте сегодня!

Мы обсудим следующие темы о типе данных DECIMAL SQL Server:

  1. Пример использования типа данных DECIMAL SQL Server
  2. «Точность» ДЕСЯТИЧНОГО значения
  3. «Масштаб» ДЕСЯТИЧНОГО значения
  4. Требования к хранению для ДЕСЯТИЧНЫХ значений
  5. Советы, рекомендации и ссылки

Начнем с темы 1. 00 🙂

1. Пример использования типа данных SQL Server DECIMAL

Давайте создадим простую таблицу с именем Books , в которой будет столбец DECIMAL для хранения Price книги:

 CREATE TABLE Books
(
BookID INT ПЕРВИЧНЫЙ КЛЮЧ ИДЕНТИФИКАЦИЯ,
Титул ВАРЧАР(50),
Автор ВАРЧАР(20),
ДЕСЯТИЧНАЯ цена(5,2)
) 

Синтаксис для DECIMAL следующий: DECIMAL(p, s)

« p » означает «Точность». это всего количество цифр, которые мы можем сохранить, как слева, так и справа от десятичной точки.

« s » означает «Шкала». Это количество цифр, которое мы можем хранить справа от десятичной точки

.

Если подумать, количество цифр, которые мы можем сохранить до левого десятичного числа, будет p – s . Таким образом, в нашем примере мы можем сохранить до 3 цифр слева от десятичной дроби при сохранении Цена книги.

Итак, давайте подумаем о типах чисел, которые мы можем хранить в этом столбце DECIMAL SQL Server.

Примеры чисел, которые мы можем хранить

Будет ли работать этот оператор INSERT?:  INSERT INTO Books VALUES («Как человек думает», «Аллен», 14,95)

Да, . До осталось десятичной дроби всего две цифры. Помните, ранее мы говорили, что у нас может быть максимум 3 . И у нас есть 2 цифры справа десятичного знака, удовлетворяющего требованиям масштаба.

Как насчет этого?:  ВСТАВИТЬ В ЗНАЧЕНИЯ Books («Съешь эту лягушку!», «Трейси», 12.449999)

Ответ тоже да, мы можем .

Вот что касается чисел до справа от десятичного знака: если указано больше цифр, чем разрешено в соответствии с « s », эти лишние цифры будут удалены, а число будет округлено до ближайшего « s ” десятичный разряд.

После выполнения этого оператора INSERT строка выглядит следующим образом:

Таким образом, число 12.449999 , очевидно, имеет более двух цифр после запятой, и это все, что разрешено для хранения в нашем типе данных. Поэтому, когда SQL сохраняет это число, он округляет десятичную дробь до 2-й цифры и отрезает все после этого.

В языке SQL это то, что известно как неявное преобразование . На самом деле мы преобразуем число с выше точность и масштаб до числа с ниже точностью и масштабом. В этом сценарии SQL Server использует округление до .

Число 12.449999  имеет тип данных DECIMAL(8,6) . Тип данных нашего столбца всего лишь DECIMAL(5,2) , что, конечно, имеет более низкую точность и масштаб. Поэтому SQL Server использует , округляя для десятичных разрядов.

Наконец, можем ли мы сохранить это значение?: INSERT INTO Books VALUES («Основы T-SQL», «Ган», 109. 449999)

Да , все хорошо! У нас есть максимальное количество цифр, разрешенных для слева десятичной дроби ( 3 ), а цифры справа будут округлены.

Бонус Пример:

Что насчет этой вставки?:  ВСТАВИТЬ В Книги ЗНАЧЕНИЙ («Книга Закона», «Картер», 2500,89)

Нет . Мы получаем сообщение об ошибке:

Когда дело доходит до цифр до слева десятичного знака, вся идея «округления» теряется. Существует строгое ограничение на количество цифр, разрешенных слева от десятичной дроби, и SQL Server не будет раунд  что угодно, если вы превысите этот лимит.

В нашем случае разрешенное количество цифр слева от десятичной точки равно 3 , помните? Так что мне просто не разрешено хранить число с 4 цифрами (или более) слева от десятичной дроби.

Наконец, как насчет этого примера?:  ВСТАВИТЬ В Books VALUES ("American Fire", "Hesse", 24)

Мы не указали десятичных разрядов, так будет ли это работать?

Да . SQL Server просто преобразует это в 24.00 , удовлетворяя количеству цифр справа от десятичной дроби (т.н. «масштабу»):

2. «Точность» значения DECIMAL

Давайте поговорим немного подробнее. о значении « p ». Как мы знаем, «p» представляет собой общее количество цифр, которые можно сохранить, как слева, так и справа от десятичного знака.

Наибольшее число, которое может быть «p», равно 38 . Повторим еще раз: это означает, что общее количество цифр, которые вы можете сохранить, используя тип данных DECIMAL, составляет 38 цифр.

Минимальное значение, которое может иметь «p», равно 1 .

3. «Масштаб» ДЕСЯТИЧНОГО значения

Как мы знаем, « s » представляет количество цифр, которые мы можем сохранить до справа от десятичной точки.

Значение «s» может быть любым от 0 до «p» .

Давайте задумаемся об этом на минуту. Можете ли вы иметь тип DECIMAL DECIMAL(5, 7) ?

Ну, это означает, что мы можем иметь Всего 5 цифр, с 7 из них справа от запятой…

Ребята, это не имеет никакого смысла .

Мы определенно могли бы получить DECIMAL(5,5) , верно? Это означает, что у нас есть в общей сложности 5 цифр, и все из них находятся справа от десятичного знака.

Отлично! Мы просто никогда не сможем сохранить число больше .99999 . Может быть, это то, что мы хотим!

4. Требования к хранению ДЕСЯТИЧНЫХ значений

Объем памяти, которую будут использовать ваши значения DECIMAL, зависит от значения « p ». Вот разбивка:

 Требования к точному хранению
1-9 5 байт
10-19 9 байт
20-28 13 байт
29-38 17 байт

 

Это одна из приятных особенностей типа данных DECIMAL. В основном вы можете использовать наименьшую точность, которая, по вашему мнению, вам понадобится для хранения ваших данных.

Чем меньше точность, тем меньше места требуется для хранения данных.

Например, если вы  знаете  , что ни одна из ваших книг не будет стоить дороже 999 долларов, и вам не нужно видеть более двух знаков после запятой, вам следует использовать тип данных DECIMAL(5,2) . Это не более 3 цифр слева от десятичной и не более 2 справа. Все значения в этом столбце будут использовать только 5 байт памяти.

Если кто-то не понимает тип данных DECIMAL , он может просто установить его как DECIMAL(30,10) , потому что «черт возьми, всегда лучше иметь больше места, чем меньше места, верно?».

НЕТ . Ваши значения будут использовать больше, чем 3X объем памяти, который вам действительно нужен. Отлично .

Вы понимаете, почему важно знать кое-что о типах данных?

5. Советы, рекомендации и ссылки

Вот список советов и рекомендаций, которые вы должны знать о типе данных SQL Server DECIMAL:

Совет № 1: Точность и масштаб по умолчанию (18,0)

Можно полностью отказаться от значений « p » и « s » и просто сказать что-то вроде:

 DECLARE @bookPrice DECIMAL 

Точность и масштаб по умолчанию для нашей новой переменной @bookPrice будут (18,0) .

Всего 18 цифр, причем ни одна из них не находится справа от десятичного числа .

Другими словами, я думаю, мы можем хранить только целое число , состоящее из 18 цифр.

Если бы вы хотели это сделать, вы могли бы просто использовать обычный целочисленный тип данных, такой как INT или BIGINT.

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

Совет № 2. Вы можете указать просто значение «p»

Это прекрасно работает:

 DECLARE @bookPrice DECIMAL(5) 

Опять же, в этой переменной @bookPrice мы указали, что хотим хранить общее число 5 цифр , причем ни один из них не находится справа от десятичного знака.

По сути, целое число, состоящее из 5 цифр.

Совет № 3: Значение «s» может быть указано только в том случае, если также указано «p»

Из нашего последнего пункта вы понимаете, что если в скобках указано одно число, SQL Server интерпретирует это как « p ”значение, которое вы хотите использовать. Невозможно указать только значение « s », а не значение « p ».

Единственный способ указать значение «s» — это если значение «p» равно , а также указано .

Совет № 4: ДЕСЯТИЧНЫЕ и ЧИСЛОВЫЕ — это одно и то же

Об этом совете особо и говорить нечего. Они являются синонимами в SQL Server и могут использоваться взаимозаменяемо. Ознакомьтесь с моим полным руководством по DECIMAL vs NUMERIC.

Ссылки

Вот ссылка на официальную документацию Microsoft по десятичным и числовым типам данных: decimal and numeric (Transact-SQL)

Следующие шаги:

Оставьте комментарий , если этот урок был вам полезен!

Чтобы быть типом данных MASTER , вы должны загрузить следующее БЕСПЛАТНОЕ одностраничное руководство :

БЕСПЛАТНОЕ одностраничное руководство по 10 основным типам данных, которые вам нужно знать!

Руководство представляет собой обсуждение наиболее распространенных типов данных, с которыми вы столкнетесь в своей карьере специалиста по базам данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *