8.2. Типы денежных единиц#

8.2. Типы денежных единиц

8.2. Типы денежных единиц

Тип money хранит сумму валюты с фиксированной дробной точностью; см. Таблица 8.3. Дробная точность определяется настройкой lc_monetary базы данных. Диапазон, показанный в таблице, предполагает наличие двух десятичных знаков. Ввод принимается в различных форматах, включая целые и числа с плавающей запятой, а также типичное форматирование валюты, например, '$1,000.00'. Вывод обычно имеет последний формат, но зависит от локали.

Таблица 8.3. Типы денежных единиц

ИмяРазмер хранилищаОписаниеДиапазон
money8 байтовсумма валюты-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 (то есть чистое число, а не деньги); валютные единицы сокращаются при делении.