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

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

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

Table 8-3. Денежные типы

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

Back to top

(С) Виктор Вислобоков, 2008-2023