2016-03-16 4 views
1

Я пишу определенный пользователь функцию и был много неприятностей делают простой арифметической:Простого арифметическое выражение не вычисляет в PL/PgSQL 9.3.5

... 
DECLARE 
    alpha numeric; 
BEGIN 
    RAISE NOTICE 'alpha: %', alpha; --alpha is NULL here 
    RAISE NOTICE 'period: %', period; --period is an integer function param, it's 10 
    alpha := 2/(period + 1); 
    RAISE NOTICE 'alpha: %', alpha; --alpha is zero (!) here 
    ... 
END; 

Но если рассчитать альфа в два шаги, он работает правильно:

... 
DECLARE 
    alpha numeric; 
BEGIN 
    RAISE NOTICE 'period: %', period; --period is 10 
    alpha := period + 1; --alpha is 11 here 
    alpha := 2/alpha; --alpha is 0.1818... 
    ... 
END; 

Что случилось с этим? Преобразуется ли альфа в целое число в первое выражение и округляется до нуля?

ответ

1

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

alpha := 2.0/(period + 1); 
+0

Это сделало, спасибо. Но я думаю, что это очень плохое поведение со стороны Pg. Я предполагаю, что это делает сумасшедшее чувство: 2/(целое число 11) = 0 в первой части, но 2/(числовые 11) = .1818 во второй части еще раз спасибо. – Bandersnatch

+4

@Bandersnatch - Это поведение требуется ANSI/SQL - это не сообщество сообщества PostgreSQL. –