SQL Server раунд после деления
В хранимой процедуре у меня есть выражение, как
select @some_val_in_percents = (@total_val / 100) * @some_val
Если я использую Round
функционировать так:
select @some_val_in_percents = Round((@total_val / 100) * @some_val, 0)
будет ли результат округлен при вычислении всего выражения или (@total_val / 100)
быть округлены и затем умножены на @some_val
?
2 ответа
Вы, кажется, неправильно рассчитываете процентное значение. Вот то, что я ожидал бы, что это будет похоже на:
@some_val * 100 / @total_val
Для ROUND()
функция, она будет влиять на конечный результат выражения, а не на частичный результат. Итак, сначала выражение оценивается полностью, затем ROUND()
применяется к результату.
Также обратите внимание (если вы еще этого не знали), что если оба операнда оператора деления являются целыми числами, SQL Server выполнит целочисленное деление, то есть результат деления будет округлен до ближайшего целого числа еще до того, как ROUND()
применены. Если вы хотите избежать этого, убедитесь, что хотя бы один из операндов не является целым числом, например, вот так:
ROUND(@some_val * 100.0 / @total_val, 2)
Обратите внимание также на второй аргумент (точность), который требуется в Transact-SQLROUND()
,
Round
будет рассчитан после оценки его содержимого.
Следовательно (@total_val / 100) * @some_val
будет округлено.