2013-12-03 15 views
2

я запускаю этот пример в SQL Server Management Studio:SQL Server: SUM() странное поведение

SELECT CONVERT(REAL, -2101.12) n INTO #t 
SELECT * FROM #t 
SELECT SUM(n) FROM #t 

Первый SELECT создает временную таблицу #t с 1 колонкой n типа реального, и это ставит 1 строку он со значением -2101.12.

Второй SELECT подтверждает, что таблица создается с предполагаемым содержанием и результатом является:

n 
--------- 
-2101.12 

Третий SELECT суммы единственное число, которое есть, но результат:

-2101.1201171875 

Итак, вопрос в том, где: 0.0001171875?

EDIT: Я знаю отсутствие точности для реальных и плавающих типов данных, к сожалению, я не могу изменить схему базы данных из-за этого. Что меня удивляет, так это то, что я ожидаю увидеть также дополнительные десятичные знаки во втором выборе, поскольку он должен храниться с такой недостаточной точностью. Так как это не происходит во втором выборе, то почему функция суммы выбирает его?

+0

использовать десятичную (18,2) вместо –

ответ

2

Типы данных известны как примерные типы данных. Поведение FLOAT и REAL следует спецификациям IEEE 754 по приблизительным числовым типам данных.

Приблизительные числовые типы данных не сохраняют точные значения, указанные для многих чисел; Они хранят чрезвычайно близкое приближение значения. Для многих приложений крошечная разница между указанным значением и сохраненным приближением не заметна. Время от времени, однако, разница становится заметной. Из-за приблизительного характера типов данных не используйте эти типы данных, если требуется точное числовое поведение, например, в финансовых приложениях, в операциях, связанных с округлением, или при проверке равенства. Вместо этого используйте данные типа integer, decimal, money или smallmoney.
Избегайте использования FLOAT или REAL столбцов в WHERE условиях поиска условий, особенно с операторами = или <>. Лучше всего ограничить FLOAT и REAL колонками с > или < сравнениями.

Source of above statement

4

Вы только что обнаружили реальные данные (с плавающей запятой) is approximate. Вместо этого используйте десятичный тип данных.

Смежные вопросы