Уважаемые комрады объясните мне
пожалуйста такую вещь: почему запрос
`select (-1) / 2 from rdb$database` возвращает 0, а не
минус единицу, как это «положено»
(практически везде целочисленное
деление реализуется именно так) при
делении с округлением до целого [(-1)/2]
([x] <= x); почему `select cast((-1) / 2.0 as integer) from
rdb$database` возвращает-таки -1? То есть,
почему при целочисленном делении
используется функция celing, которая
округляет свой аргумент до ближайшего
целого, которое не меньше аргумента
(celing(x) >= x), а при приведении чисел с
плавающей точкой к целому
используется другая операция
округления, а именно floor(x) или [x],
которая округляет аргумент до
ближайшего целого, которое меньше или
равно аргументу ([x] <= x).

В PSQL вообще получается довольно
весело, например, есть три переменных
типа integer a = 2, b = 3 и c = null:
c = (b - 2 * a) / 2;
c => 0

c = (b - 2 * a) / 2.0;
c => -1

c = a + (b - 2 * a) / 2;
c => 2

c = a + (b - 2 * a) / 2.0;
c => 2;

Насколько я понимаю это или баг, или
design flow. Или я не прав?
-- 
SVBEEV -- Feoktistov Andrey.

Ответить