Как мне интерпретировать точность и масштаб числа в базе данных?


245

У меня есть следующий столбец, указанный в базе данных: десятичный (5,2)

Как можно это интерпретировать?

В соответствии со свойствами столбца, которые отображаются в SQL Server Management Studio, я вижу, что это означает: десятичное число (точность чисел, числовой масштаб).

Что означают точность и масштаб в реальном выражении?

Было бы легко интерпретировать это как десятичную с 5 цифрами и двумя десятичными разрядами ... т.е. 12345.12

PS Мне удалось определить правильный ответ от коллеги, но мне было очень трудно найти ответ в Интернете. Поэтому я хотел бы, чтобы вопрос и ответ были задокументированы здесь на stackoverflow для дальнейшего использования.

Ответы:


397

Числовая точность относится к максимальному количеству цифр, присутствующих в числе.

то есть 1234567.89 имеет точность 9

Числовой масштаб относится к максимальному количеству десятичных знаков

то есть 123456,789 имеет шкалу 3

Таким образом, максимально допустимое значение для десятичной (5,2) составляет 999,99


14
Не забывайте, что если вы используете систему, которая позволяет вам заранее задавать точность и масштаб ввода для процента в чем-то вроде Microsoft Access, вы должны рассматривать процент как форму целого числа. В этом случае для 25,5% потребуется точность 4 и масштаб 3 (не один), поскольку мы должны рассматривать его как 0,225. Я столкнулся с этой проблемой на ранней стадии и некоторое время был озадачен, удивляясь, почему масштаб 1 не работает.
Эштон Шитс

1
@mezoid Что означает отрицательное значение шкалы?
Компьютерщик

@Geek Согласно technet.microsoft.com/en-us/library/ms187746.aspx Масштаб не может быть меньше нуля. 0 <= масштаб <= точность. По сути, отрицательное значение шкалы было бы бессмысленным.
мезоид


1
Разве это не должно быть: «Числовая точность относится к максимальному количеству цифр, которое может присутствовать в числе».? Точное число 123,5 также может быть с точностью до 10, но больше не нужно добавлять цифры. Или это станет 123.5000000?
Chris311

86

Точность числа - это количество цифр.

Шкала числа - это количество цифр после десятичной точки.

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

Например, десятичное поле, определенное с precision=5и scale=2позволило бы следующие значения:

  • 123.45 (Р = 5, с = 2)
  • 12.34 (Р = 4, с = 2)
  • 12345 (Р = 5, с = 0)
  • 123.4 (Р = 4, с = 1)
  • 0 (Р = 0, s = 0)

Следующие значения не допускаются или могут привести к потере данных:

  • 12.345(p = 5, s = 3) => может быть усечено до 12.35(p = 4, s = 2)
  • 1234.56(p = 6, s = 2) => может быть усечено до 1234.6(p = 5, s = 1)
  • 123.456(p = 6, s = 3) => может быть усечено в 123.46(p = 5, s = 2)
  • 123450 (p = 6, s = 0) => вне диапазона

Обратите внимание, что диапазон обычно определяется точностью: |value| < 10^p...


5
Обратите внимание, что MS SQL Server не будет разрешать 12345 или 1234.56, потому что «[шкала] вычитается из [точности], чтобы определить максимальное количество цифр слева от десятичной точки». (источник: десятичные и числовые )
molnarm

Как насчет 12345000? Точность 5 или 8? Если 5, с какой шкалой? Шкала -3?
towi

@towi что это значит? Если бы вы хотели сохранить это, вы бы использовали 8,0.
Роб Грант

Хороший ответ, но почему 123450 (p=6,s=0)вне диапазона? 123450 имеет 6 цифр и без цифры после точки?
Матиас Бургер

1
@MatthiasBurger 123450 (p=6,s=0)будет вне диапазона для десятичного поля с точностью 5 (как упомянуто в примере). Потому что точность числа, которое вы хотите сохранить в поле, должна быть меньше или равна точности поля.
Snozzlebert

26

Точность, масштаб и длина в документации по SQL Server 2000 гласят:

Точность - это количество цифр в числе. Шкала - это число цифр справа от десятичной точки в числе. Например, число 123,45 имеет точность 5 и шкалу 2.


Спасибо. Я только что понял, что часть кода Delphi / Pascal использует шкалу 0, чтобы отрубить десятичную часть числа с плавающей точкой
peterchaula
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.