Почему SQL Server округляет результаты деления двух целых чисел? - PullRequest
22 голосов
/ 07 апреля 2009

У меня есть таблица со столбцом smallint, которая содержит проценты в виде целых чисел (то есть 50, 75, 85 и т. Д.)

Когда я делю этот столбец на 100, как в

SELECT MY_COLUMN/100 AS PCT_AS_FRACTION
FROM MY_TABLE

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

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

SELECT 50 / 100 AS TEST_VALUE

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

Ответы [ 6 ]

32 голосов
/ 07 апреля 2009

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

Вы пытались разделить MY_COLUMN на 100,0?

24 голосов
/ 07 апреля 2009

Литые целые числа.

SELECT (cast(50 AS float)/100)
1 голос
/ 12 января 2015

Когда вы используете / (Разделить) оператор это

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

и

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

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

1 голос
/ 04 августа 2010

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

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

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

1 голос
/ 07 апреля 2009

Вы делаете целочисленное деление. 50/100 - это 0 с остатком 50.

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

0 голосов
/ 07 апреля 2009

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

Можно и так разыграть.

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

...