Почему SQL Server округляет результаты деления двух целых чисел?

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

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

SELECT MY_COLUMN/100 AS PCT_AS_FRACTION
FROM MY_TABLE

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

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

SELECT 50 / 100 AS TEST_VALUE

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


person JosephStyons    schedule 06.04.2009    source источник


Ответы (6)


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

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

person Sniggerfardimungus    schedule 06.04.2009
comment
Деление на 100,0 работает. Простое объяснение простой проблемы. Спасибо :) - person JosephStyons; 07.04.2009
comment
Между прочим, умножение на 0,01 дает тот же эффект и, возможно, более очевидный. - person JosephStyons; 08.04.2009
comment
Конкретным термином для целочисленного языка является усечение. 75/100 по-прежнему возвращает 0. Определение состоит в том, чтобы просто удалить любую дробную часть из числа. - person Rabid; 04.08.2010

Назовите целые числа.

SELECT (cast(50 AS float)/100)
person boj    schedule 06.04.2009

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

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

person Michael    schedule 06.04.2009

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

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

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

person Milan    schedule 04.08.2010

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

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

а также

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

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

person gotqn    schedule 12.01.2015

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

Так же должно быть возможно бросить

ВЫБЕРИТЕ (50/100)::числовой;

person PepperBob    schedule 06.04.2009