Я хотел бы знать, как именно работает функция SQL Server round.
Другие вопросы говорят:
PRINT ROUND(1890.125000, 2)
-- produces 1890.130000
PRINT ROUND(1890.124999, 2)
-- produces 1890.12000
все ясно, но
У меня есть таблица в SQL, которая представляет строки продаж.
Тип столбца Price в таблице SalesPrice — float, и я запускаю этот запрос для одной строки со значением 56.705 в поле Price.
SELECT Price, Round(Price, 2) AS RPrice, Round(56.705, 2) AS RDirect
FROM SalesPrice
WHERE Id = nnnnnn;
и результаты:
Я не понимаю, как это возможно. Есть идеи?
The Price column type in SalesPrice table is float -> зачем использовать float для обозначения цен? Переключитесь на десятичный формат.
Возможно, вам повезет, если вы преобразуете число с плавающей запятой в десятичное число перед выполнением раунда. Пример смотрите здесь: dbfiddle.uk/OMBnDMor
Ссылка Learn.microsoft.com/en-us/sql/t-sql/functions/…
Используйте что-то вроде: cast(Price as decimal(38,35)), и вы увидите, что то, что вы сохранили (56.705) в этом столбце с плавающей запятой, на самом деле сохраняется как 56.70499999999999829469743417575955391 (ошибка представления в float)


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