Тип moneyхранит сумму в валюте с фиксированной дробной точностью. Дробная точность определяется настройкой базы данных lc_monetary. Диапазон, показанный в таблице, предполагает наличие двух цифр дробной части. Ввод принимается в различных форматах, включая целые числа и литералы с плавающей запятой, а также в типичном денежном формате, таком как '$1,000.00'
. Вывод обычно в последней форме, но зависит от локали.
Денежные типы
Имя | Размер хранилища | Описание | Диапазон |
---|---|---|---|
money | 8 байт | сумма в валюте | -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
(т. е. чистое число, а не деньги); денежные единицы компенсируют друг друга при делении.
0 комментариев