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
(то есть просто число, не денежная величина); денежные единицы измерения при делении сокращаются.