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

Денежные типы

ИмяРазмер хранилищаОписаниеДиапазон
money8 байтсумма в валюте-92233720368547758,08 до +92233720368547758,07

Поскольку выходные данные этого типа данных зависят от локали, загрузка moneyданных в базу данных с другим параметром lc_monetary. Во избежание проблем перед восстановлением дампа в новую базу данных убедитесь, что lc_monetaryон имеет то же или эквивалентное значение, что и в базе данных, в которую был создан дамп.

Значения типов данных numeric, intи bigintмогут быть приведены к money. Преобразование из типов данных realи может быть выполнено путем приведения к первому, например:double precisionnumeric

SELECT '12.34'::float8::numeric::money;

Однако это не рекомендуется. Числа с плавающей запятой не следует использовать для обработки денег из-за возможных ошибок округления.

Значение moneyможет быть приведено numericбез потери точности. Преобразование в другие типы потенциально может привести к потере точности и также должно выполняться в два этапа:

SELECT '52093.89'::money::numeric::float8;

Деление moneyзначения на целое значение выполняется с усечением дробной части в сторону нуля. Чтобы получить округленный результат, разделите на значение с плавающей запятой или приведите moneyзначение к numericдо деления и обратно к moneyпосле. (Последнее предпочтительнее, чтобы избежать риска потери точности.) Когда moneyзначение делится на другое moneyзначение, результатом является double precision(т. е. чистое число, а не деньги); денежные единицы компенсируют друг друга при делении.