8.2. Типы денежных единиц#
8.2. Типы денежных единиц
Тип money
хранит сумму валюты с фиксированной дробной точностью; см. Таблица 8.3. Дробная точность определяется настройкой lc_monetary базы данных. Диапазон, показанный в таблице, предполагает наличие двух десятичных знаков. Ввод принимается в различных форматах, включая целые и числа с плавающей запятой, а также типичное форматирование валюты, например, '$1,000.00'
. Вывод обычно имеет последний формат, но зависит от локали.
Таблица 8.3. Типы денежных единиц
Имя | Размер хранилища | Описание | Диапазон |
---|---|---|---|
money | 8 байтов | сумма валюты | -92233720368547758.08 до +92233720368547758.07 |
Поскольку вывод этого типа данных зависит от локали, может возникнуть проблема при загрузке данных типа money
в базу данных с другим значением параметра lc_monetary
. Чтобы избежать проблем, перед восстановлением дампа в новую базу данных убедитесь, что параметр lc_monetary
имеет то же значение или эквивалентное значение, что и в базе данных, из которой был создан дамп.
Значения типов данных numeric
, int
и bigint
могут быть приведены к типу money
.
Преобразование из типов данных real
и double precision
может быть выполнено путем сначала приведения к типу numeric
, например:
SELECT '12.34'::float8::numeric::money;
Однако, это не рекомендуется. Использование чисел с плавающей точкой для работы с деньгами не рекомендуется из-за возможности ошибок округления.
Значение типа money
может быть приведено к типу numeric
без потери точности. Преобразование в другие типы может потенциально привести к потере точности и также должно выполняться в два этапа:
SELECT '52093.89'::money::numeric::float8;
Деление значения типа money
на целое число выполняется с отбрасыванием дробной части в сторону нуля. Чтобы получить округленный результат, разделите на значение с плавающей точкой или приведите значение типа money
к типу numeric
перед делением и обратно к типу money
после деления. (Последнее предпочтительнее, чтобы избежать потери точности). При делении значения типа money
на другое значение типа money
результатом будет значение типа double precision
(то есть чистое число, а не деньги); валютные единицы сокращаются при делении.