Схоже, що 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це лише псевдонім для numericPostgres і широко використовується для грошових даних, оскільки він є "довільною точністю". Посібник :
Тип
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 - один найважливіші компанії з фінансових послуг для глобальної електронної комерції.