2009-04-06 4 views
22

У меня есть таблица с SMALLINT столбец, содержащий проценты как целые числа (например, 50, 75, 85 и т.д.)Почему SQL Server завершает результаты деления двух целых чисел?

Когда я разделить эту колонку на 100, как в

SELECT MY_COLUMN/100 AS PCT_AS_FRACTION 
FROM MY_TABLE 

результат округляется до ближайшего целого числа. Например, для строки, содержащей число «50», я получаю нулевой результат.

я могу дублировать это с простым утверждением:

SELECT 50/100 AS TEST_VALUE 

Почему это, и как я могу получить более высокую точность в мой результат?

ответ

32

Когда вы выполняете целочисленное деление (целое число, деленное на целое), вы всегда получаете целочисленный ответ. 50/100 = .50, что равно 0 в целых числах.

Вы пробовали делиться MY_COLUMN на 100.0?

+2

Разделение на 100,0 работ.Простое объяснение простой проблемы. Спасибо :) – JosephStyons

+0

Кстати, умножение на 0,01 имеет тот же эффект и, возможно, более очевидно. – JosephStyons

+0

Конкретный термин «целочисленный» означает * усечение *. '75/100' по-прежнему возвращает' 0'. Определение состоит в том, чтобы просто удалить любую дробную часть из числа. – Rabid

1

Вы выполняете целочисленное деление. 50/100 равно 0 с остатком 50.

Вам необходимо использовать деление с плавающей запятой.

24

Всего целых чисел.

SELECT (cast(50 AS float)/100) 
0

Вы делите 2 целых числа, в результате чего получается другое целое число.

Это должно можно отливать таким образом, слишком

SELECT (50/100) :: числовая;

+0

Это не похоже на работу с MS SQL Server. – svick

1

NB - Будьте осторожны, так как остаток целого деления не округляется. Скорее, он отбрасывается. Это эквивалентно вызову функции sql FLOOR.

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

Это может часто иметь значение при выполнении арифметики dateTime в SQL.

1

При использовании /(Divide) оператора он

Возвращает тип данных аргумента с более высоким приоритетом.

и

Если целое число дивидендов делится на целое делитель, то результат будет целое число, которое имеет любую дробную часть результата усеченной.

Таким образом, вы должны бросить хотя бы один из операндов соответствующего типа: decimal and numeric или float or real.

Смежные вопросы