Answers:
强制2单位精度的数字。切勿使用float或数据类型之类的float来表示货币,因为如果这样做,当财务报告的底线数字错误地加上+或-几美元时,人们将不高兴。
据我所知,货币类型只是出于历史原因而保留。
scale - precision
numeric(3,2)
将能够存储最大9.99
3-2 = 1
您的消息来源绝不是官方的。追溯到2011年,我什至都不认识作者。如果货币类型被正式“劝阻”,则PostgreSQL会在手册中这样说- 事实并非如此。
有关更多官方信息,请阅读pgsql-general中的此线程(仅从本周开始!),并请核心开发人员发表声明,包括D'Arcy JM Cain(货币类型的原始作者)和Tom Lane:
有关最新版本中的改进的相关答案(和评论!):
基本上,money
有(非常有限的)用途。在Postgres的维基建议将在很大程度上避免它,除了那些狭义的案件。超过的优势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个微型美元= 0.000001美元。
numeric(15,6)
在另一个答案中建议了这个?
bigint
。有developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/…,但它的支持有限(目前)和警告(例如,进行货币换算时,您不能轻易将其乘以浮点数) 。鉴于您可以使用微美元将其存储在JS整数中的最大值为90亿美元,这在大多数情况下可能仍然不错。