Непоследовательность SQL Server Round()?

Я хотел бы знать, как именно работает функция SQL Server round.

Другие вопросы говорят:

PRINT ROUND(1890.125000, 2)
-- produces 1890.130000

PRINT ROUND(1890.124999, 2)
-- produces 1890.12000

все ясно, но

У меня есть таблица в SQL, которая представляет строки продаж. Тип столбца Price в таблице SalesPricefloat, и я запускаю этот запрос для одной строки со значением 56.705 в поле Price.

SELECT Price, Round(Price, 2) AS RPrice, Round(56.705, 2) AS RDirect
FROM SalesPrice
WHERE Id = nnnnnn;

и результаты:

Цена Цена РДирект 56,705 56,7 56.710

Я не понимаю, как это возможно. Есть идеи?

Очень вероятно и почти наверняка, что 56.705 — это просто отображение числа с плавающей запятой, сохраненного для этой записи. По сути, вполне вероятно, что оно уже округлено (так сказать) до трех десятичных цифр и что более точное представление может быть чем-то вроде 5.7049999898899 или чем-то в этом роде. Таким образом, вы получаете визуализированный 56.705 при выборе столбца, но при округлении этого числа с плавающей запятой до двух десятичных знаков вы получаете 56.70 или 56.7. Такова природа хранения чисел float и real.

JNevill 10.06.2024 20:11
The Price column type in SalesPrice table is float -> зачем использовать float для обозначения цен? Переключитесь на десятичный формат.
testing-for-ya 10.06.2024 20:12

Возможно, вам повезет, если вы преобразуете число с плавающей запятой в десятичное число перед выполнением раунда. Пример смотрите здесь: dbfiddle.uk/OMBnDMor

JNevill 10.06.2024 20:17

Ссылка Learn.microsoft.com/en-us/sql/t-sql/functions/…

Mark Schultheiss 10.06.2024 21:39

Используйте что-то вроде: cast(Price as decimal(38,35)), и вы увидите, что то, что вы сохранили (56.705) в этом столбце с плавающей запятой, на самом деле сохраняется как 56.70499999999999829469743417575955391 (ошибка представления в float)

tinazmu 11.06.2024 01:09
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сохраненное значение не совсем 56.705. Вот почему float не является хорошим выбором типа данных для всего, что связано с деньгами.

Точно; Money и Decimal — фиксированные числовые типы данных, а Float — приблизительный числовой тип данных. (и Деньги * Деньги тоже не так уж и велики)

Mark Schultheiss 10.06.2024 21:49

Другие вопросы по теме