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

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

Таблица 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;

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

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

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

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