Схоже, що Money
тип не рекомендується, як описано тут
У моїй програмі потрібно зберігати валюту, який тип даних я буду використовувати? Числові, гроші чи ПЛАТИ?
Схоже, що Money
тип не рекомендується, як описано тут
У моїй програмі потрібно зберігати валюту, який тип даних я буду використовувати? Числові, гроші чи ПЛАТИ?
Відповіді:
Число з примусовою точністю 2 одиниці. Ніколи не використовуйте плаваючий чи плаваючий типу типу даних для представлення валюти, тому що якщо ви це зробите, люди будуть незадоволені, коли цифра підсумків фінансового звіту неправильна на + або - кілька доларів.
Наскільки я можу сказати, тип грошей залишається лише з історичних причин.
scale - precision
numeric(3,2)
зможе зберігати макс.9.99
3-2 = 1
Ваше джерело жодним чином не є офіційним. Він датується 2011 роком, і я навіть не визнаю авторів. Якби форма грошей була офіційно "відсторонена", PostgreSQL сказав би це в посібнику - чого вона не робить .
Для отримання більш офіційного джерела прочитайте цю тему в pgsql-генералі (з цього тижня!) , Із заявами основних розробників, включаючи D'Arcy JM Cain (оригінальний автор грошового типу) та Тома Лейн:
Відповідна відповідь (та коментарі!) Про покращення в останніх випусках:
В основному, money
має свої (дуже обмежені) використання. Postgres Wiki пропонує у чому уникнути, за винятком тих вузько визначених випадків. Перевага по порівнянні numeric
є продуктивність .
decimal
це лише псевдонім для numeric
Postgres і широко використовується для грошових даних, оскільки він є "довільною точністю". Посібник :
Тип
numeric
може зберігати номери з дуже великою кількістю цифр. Це особливо рекомендується для зберігання грошових сум та інших кількостей, де потрібна точність.
Особисто я люблю зберігати валюту як integer
представницьку центів, якщо дробові центи ніколи не виникають (в основному там, де гроші мають сенс). Це більш ефективно, ніж будь-який інший із згаданих варіантів.
money
тип, фактично, застарів. Проблеми виправлені, а тип було додано ще в пізніших версіях. Особисто я люблю зберігати валюту як integer
представницьку центів.
Ваш вибір:
bigint
: зберігайте суму в центах. Саме для цього використовуються транзакції EFTPOS.decimal(12,2)
: збережіть суму рівно з двома знаками після коми. Це те, що використовує більшість програм загальної книги.float
: жахлива ідея - неадекватна точність. Це те, чим користуються наївні розробники.Варіант 2 - найпоширеніший і найпростіший в роботі. Зробіть точність (12 у моєму прикладі, тобто 12 цифр у всьому) такою великою чи маленькою, як найкраще підходить для вас.
Зауважте, що якщо ви агрегуєте кілька транзакцій, які були результатом обчислення (наприклад, із залученням валютного курсу), в єдине значення, яке має ділове значення, точність повинна бути вищою, щоб забезпечити точне значення макросу; Подумайте про використання чогось подібного, decimal(18, 8)
щоб сума була точною, а окремі значення можна округлити до відсотків точністю для відображення.
numeric(15,4)
чи numeric(15,6)
це гарна ідея.
Я зберігаю всі мої грошові поля як:
numeric(15,6)
Має бути надмірним число знаків після коми, але якщо є навіть найменший шанс, вам доведеться мати справу з кількома валютами, вам знадобиться стільки точності для конвертації. Незалежно від того, що я представляю користувачеві, я завжди зберігаю долар США. Таким чином я можу легко конвертувати в будь-яку іншу валюту, враховуючи коефіцієнт конверсії за відповідний день.
Якщо ви ніколи не робите нічого, крім однієї валюти, найгірше, що ви витратили трохи місця, щоб зберегти кілька нулів.
bigint
Я рекомендую використовувати мікродолари (або подібну основну валюту). Мікро означає 1 мільйон, тому 1 мікродолар = 0,000001 дол.
numeric(15,6)
запропоновано в іншій відповіді?
bigint
. Існує developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…, але він надається з обмеженою підтримкою (на даний момент) та застереженнями (наприклад, ви не можете легко помножити його на поплавок при здійсненні конвертації валюти) . Зважаючи на те, що максимум, який ви можете зберігати в цілому JS, використовуючи мікродолари, становить 9 мільярдів доларів, що, мабуть, все ще добре для більшості випадків.
Використовуйте BigInt
для зберігання валюти як додатне ціле число, що представляє грошову вартість в найменшій валютній одиниці (наприклад, 100 центів для зберігання 1,00 долара або 100 для зберігання 100 (японська ієна, валюта з нульовою десятковою). Це те, що робить Stripe - один найважливіші компанії з фінансових послуг для глобальної електронної комерції.