Математические функции

Деление целых чисел

В PostgreSQL числа могут быть разных типов данных:

ИмяРазмерОписаниеДиапазон
smallint2 байтацелое в небольшом диапазоне-32768 .. +32767
integer4 байтатипичный выбор для целых чисел-2147483648 .. +2147483647
bigint8 байтцелое в большом диапазоне-9223372036854775808 .. 9223372036854775807
decimalпеременныйвещественное число с указанной точностьюдо 131072 цифр до десятичной точки и до 16383 — после
numericпеременныйвещественное число с указанной точностьюдо 131072 цифр до десятичной точки и до 16383 — после
real4 байтавещественное число с переменной точностьюточность в пределах 6 десятичных цифр
double precision8 байтвещественное число с переменной точностьюточность в пределах 15 десятичных цифр
smallserial2 байтанебольшое целое с автоувеличением1 .. 32767
serial4 байтацелое с автоувеличением1 .. 2147483647
bigserial8 байтбольшое целое с автоувеличением1 .. 9223372036854775807

При делении двух целочисленных чисел остаток от деления отбрасывается.

SELECT 1 / 2 AS res1,
       5 / 3 AS res2,
       24 / 5 AS res3,
       -24 / 5 AS res4
#res1res2res3res4
1014-4

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

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

В выражении есть константа

Если в выражении есть константа, то можно дописать .0 к константе.

SELECT 1.0 / 2 AS res1,
       5.0 / 3 AS res2,
       24.0 / 5 AS res3,
       -24.0 / 5 AS res4
#res1res2res3res4
10.51.674.8-4.8

В выражении нет констант

SELECT value_1, value_2, value_1 / value_2 AS result
  FROM table_1
#value_1value_2result
1522

В таком случае можно первое число умножить на 1.0:

SELECT 1.0 * value_1 / value_2 AS result
  FROM table_1
#result
12.5

Или явно преобразовать число к числу с дробной частью:

SELECT value_1::numeric / value_2 AS result
  FROM table_1
#result
12.5

P.S. По-хорошему нужно разбираться в типах данных. Знать нюансы хранения типов данных в базе данных, точность хранения и механику округления для каждого типа данных.

ПредыдущаяСледующая