Точность типа данных SQL Server - Нео, что реально? - PullRequest
1 голос
/ 13 января 2010

SQL Sever 2000 документация :

Является ли число с плавающей запятой данными с следующие допустимые значения: –3.40E + От 38 до -1,18E - 38,0 и 1,18E - От 38 до 3.40E + 38. Размер хранилища 4 байта. В SQL Server это синоним по-настоящему это float (24).

SQL Server 2005 документация :

ИСО в качестве реального синонима является float (24).

EDIT: Учитывая то, что я читаю, говорит, что точность равна 7, но я могу ввести в своей базе данных (SQL Server 2005) максимум 9 см. Ниже, как указано выше здесь вопрос №. 7.

Пример: 0.180000082

Какова истинная точность real и существуют ли параметры конфигурации (например, режимы совместимости), которые могут повлиять на точность?

Ответы [ 3 ]

8 голосов
/ 13 января 2010

Ваш ответ находится на той же странице, на которую вы ссылались:

Для типа данных FLOAT n - это число битов, используемых для хранения мантиссы в научной нотации

24 бита мантиссы дают вам (приблизительно) 7 десятичных цифр точности (потому что 2 ^ 24 ~ = 10 ^ 7).

изменить добавить:

Обратите внимание, что все продолжают говорить «приблизительно» - это не просто так:)

Двоичные числа с плавающей запятой и десятичные литералы не обязательно играют вместе интуитивно понятным образом. Для справки прочитайте Что должен знать каждый ученый об арифметике с плавающей точкой . Также обратите внимание, что высказывание «примерно 7 десятичных цифр точность » не является несовместимым с возможностью хранить значение с более чем 7 значащими цифрами! Это, однако, означает, что этот тип данных не сможет различить, например, 0.180000082 и 0.180000083, потому что он на самом деле не хранит значение точное :

declare @f1 real
declare @f2 real

set @f1 = 0.180000082
set @f2 = 0.180000083

select @f1, @f2

select @f1 - @f2

------------- -------------
0.1800001     0.1800001

(1 row(s) affected)


-------------
0

(1 row(s) affected)

Дело в том, что real совпадает с float(24), двоичным числом с плавающей запятой с 24 битами мантиссы, и я не верю, что есть способ изменить это. Типы с плавающей точкой, как правило, не очень хороший выбор, если вы хотите хранить точные десятичные числа.

1 голос
/ 13 января 2010

SQL Server использует 4 или 8 байтов для хранения недесятичных чисел с плавающей запятой.

Если вы задаете вещественное или любое значение в диапазоне с плавающей точкой <1> для плавающей <24>, SQL-сервер используетплавать <24> внутри.Если вы используете float или что-либо в диапазоне float <25> для float <53> (ограничение), он использует float <53>, который также известен как двойная точность.

Документация MSDN для float в SQL Server2005 здесь: float и real (Transact-SQL)

Если вам нужна конкретная точность, вместо этого обратите внимание на использование десятичной дроби, которая обеспечивает настраиваемую точность и масштаб: десятичная дробь ичисловой (Transact-SQL)

1 голос
/ 13 января 2010

Вы путаете двоичную (основание 2) точность с десятичной (основание 10) точностью. 24 бита дают примерно 7 десятичных цифр.

...