В PostgreSQL числа могут быть разных типов данных:
Имя | Размер | Описание | Диапазон |
---|---|---|---|
smallint | 2 байта | целое в небольшом диапазоне | -32768 .. +32767 |
integer | 4 байта | типичный выбор для целых чисел | -2147483648 .. +2147483647 |
bigint | 8 байт | целое в большом диапазоне | -9223372036854775808 .. 9223372036854775807 |
decimal | переменный | вещественное число с указанной точностью | до 131072 цифр до десятичной точки и до 16383 — после |
numeric | переменный | вещественное число с указанной точностью | до 131072 цифр до десятичной точки и до 16383 — после |
real | 4 байта | вещественное число с переменной точностью | точность в пределах 6 десятичных цифр |
double precision | 8 байт | вещественное число с переменной точностью | точность в пределах 15 десятичных цифр |
smallserial | 2 байта | небольшое целое с автоувеличением | 1 .. 32767 |
serial | 4 байта | целое с автоувеличением | 1 .. 2147483647 |
bigserial | 8 байт | большое целое с автоувеличением | 1 .. 9223372036854775807 |
При делении двух целочисленных чисел остаток от деления отбрасывается.
SELECT 1 / 2 AS res1,
5 / 3 AS res2,
24 / 5 AS res3,
-24 / 5 AS res4
# | res1 | res2 | res3 | res4 |
---|---|---|---|---|
1 | 0 | 1 | 4 | -4 |
Обрати внимание, что результат не округляется до ближайшего целого числа. Остаток от деления именно отбрасывается.
Если требуется остаток от деления сохранить, то нужно каким-то образом привести одно из чисел к числу с дробной частью.
В выражении есть константа
Если в выражении есть константа, то можно дописать .0
к константе.
SELECT 1.0 / 2 AS res1,
5.0 / 3 AS res2,
24.0 / 5 AS res3,
-24.0 / 5 AS res4
# | res1 | res2 | res3 | res4 |
---|---|---|---|---|
1 | 0.5 | 1.67 | 4.8 | -4.8 |
В выражении нет констант
SELECT value_1, value_2, value_1 / value_2 AS result
FROM table_1
# | value_1 | value_2 | result |
---|---|---|---|
1 | 5 | 2 | 2 |
В таком случае можно первое число умножить на 1.0
:
SELECT 1.0 * value_1 / value_2 AS result
FROM table_1
# | result |
---|---|
1 | 2.5 |
Или явно преобразовать число к числу с дробной частью:
SELECT value_1::numeric / value_2 AS result
FROM table_1
# | result |
---|---|
1 | 2.5 |
P.S. По-хорошему нужно разбираться в типах данных. Знать нюансы хранения типов данных в базе данных, точность хранения и механику округления для каждого типа данных.