Почему это различие в производительности?

select ROUND(5.8990,0) output is 6.000 select ROUND(643/109,0) output is 5 

Почему это различие в производительности?

Это связано с использованием целочисленного деления.

 > select 643/109; 5 > select round(643/109, 0); 5.0 > select 643/109.0; 5.89908256880734 > select round(643/109.0, 0); 6.0 

Первая команда показывает, что происходит целочисленное деление. Итак, измените делитель или дивиденд на float, и вы получите ожидаемый результат, как показано в последней команде.

Это связано с тем, что int / int возвращает только часть int.

Попробуй это:

 select Round(Cast(643 as decimal)/cast(109 as decimal),0) 

Обходным путем было бы просто добавить десятичную точку к любому из чисел. Тогда параметр для круглой функции будет десятичным, а не целочисленным.

Если вы хотите получить десятичную часть, вы также должны использовать float или decimal, см. Ниже код один раз

 select ROUND(CONVERT(Decimal(18,2),643)/CONVERT(Decimal(18,2),109),0) output is 6.000 

В первом запросе select ROUND(5.8990,0) выход будет 6.000, так как значение, 5.8990, принятое считается десятичным из-за наличия точки. Но в случае второго запроса select ROUND(643/109,0) 643 и 109 считаются целыми числами, поэтому возвращаемое значение равно 5, а не 5.8990, как вы ожидали. Чтобы изменить получение результата как 6.000, все, что вам нужно сделать, это передать второй запрос следующим образом:

select ROUND(643.00/109.00,0)

введите описание изображения здесь

select 643/109 дает 5 частных. Итак, select ROUND(5,0)5

Во втором случае вы делите два целых числа, поэтому в результате вы получите целое число. Результат разделения равен 5.89, но он просто отбросит все остатки, потому что ему требуется целое число в качестве возврата, так что вы получите 5. Результат усечен. Больше информации

Если вы хотите иметь десятичный результат, просто используйте десятичное число в любой из частей деления, например

 select ROUND(643.0/109,0) -- returns 6 -- or select ROUND(643/109.0,0) -- also returns 6 

В первом случае ROUND не будет обрезать результат, он будет округлен до следующего ближе целого (в соответствии с параметрами, которые вы предоставили). Вы можете получить тот же результат, если используете

 select ROUND(5.8990, 0, 1) -- returns 5 

Дополнительная информация о ROUND здесь

Давайте будем гением компьютера.