SQL Server раунда функция не работает хорошо - PullRequest
1 голос
/ 27 февраля 2012

Я использую SQL Server 2000 и сталкиваюсь с проблемой круглых функций, как следующий оператор работает нормально.

SELECT ROUND(5 * 7.83, 1)

Результат будет 39,2

Но когда я получу эти значения из таблицы, получится 39,1, что означает, что оно усекается и не округляется.

SELECT ROUND(rate * qty, 1) 
  FROM tbl

Результат будет 39,1

rate и qty столбцы типов данных с плавающей запятой.Вставьте 5 в qty и 7,83 в rate, затем проверьте его.Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Ваш образец просто не отражает типы данных.

Попробуйте эти два вместо:

SELECT ROUND(5 * 7.83, 1)
SELECT ROUND(cast(5 as float) * cast(7.83 as float), 1)

Второй соответствует типам данных вашей таблицы. Типы данных с плавающей запятой не предназначены для точных десятичных вычислений, вместо них используйте десятичный тип.

Что должен знать каждый компьютерщик об арифметике с плавающей точкой

Не теряя слишком много точности для нормальных чисел, вы можете просто привести к десятичному на лету, чтобы форсировать понятную человеку десятичную арифметику, например,

SELECT ROUND(cast(rate as decimal(10,5)) * cast(qty as decimal(10,5), 1) 
  FROM tbl
1 голос
/ 27 февраля 2012

Преобразовать значения таблицы в реальные,

SELECT ROUND(convert(real,rate)*convert(real,qty),1)
...