答案 0 :(得分:90)
您的来源绝不是正式的。它可以追溯到2011年,我甚至不承认作者。如果货币类型“气馁”,PostgreSQL会在手册中说明这一点 - which it doesn't。
对于更官方消息来源,请阅读this thread in pgsql-general (from just this week!),其中包括来自核心开发人员的声明,包括D'Arcy J.M. Cain(钱币类型的原始作者)和Tom Lane:
基本上,money
有其(有限)用途。优于numeric
的优势是性能。
decimal
只是Postgres中numeric
的别名。
有关最新版本改进的相关答案(和评论!):
就个人而言,我喜欢将货币存储为代表Cents的integer
。这比任何其他提到的选项更有效。
答案 1 :(得分:78)
Numeric强制2单位精度。永远不要使用float或float这样的数据类型来表示货币,因为如果你这样做,当财务报告的底线数字不正确+或 - 几美元时,人们就会不高兴。
据我所知,货币类型只是因为历史原因而留下。
答案 2 :(得分:54)
您的选择是:
integer
:以美分存储金额。这就是EFTPOS交易所使用的。decimal(12,2)
:存储金额正好两位小数。这是大多数总帐软件使用的。float
:糟糕的主意 - 准确性不足。这是天真的开发人员使用的。选项2是最常见且最容易使用的选项。使精度(在我的例子中为12,总共12位数)大小,最适合你。
请注意,如果您将作为计算结果的多个交易(例如涉及汇率)汇总为具有商业含义的单个值,则精度应该更高,以提供准确的宏值;考虑使用类似decimal(18, 8)
之类的东西,这样总和是准确的,并且各个值可以四舍五入到精确度以便显示。
答案 3 :(得分:19)
我将所有货币字段保存为:
numeric(15,6)
拥有那么多小数位似乎太过分了,但如果你有多少机会处理多种货币,那么转换你需要那么多精确度。无论我呈现一个用户,我总是存储到美元。这样,考虑到当天的转换率,我可以随时转换为任何其他货币。
如果你从不做任何事情,除了一种货币,最糟糕的是你浪费了一些空间来存储一些零。
答案 4 :(得分:9)
使用BigInt
将货币存储为以最小货币单位表示货币值的正整数(例如,存储100美分存储1.00美元或100存储100日元(日元,一种十进制货币)。这就是Stripe的工作-一家最重要的全球电子商务金融服务公司。
答案 5 :(得分:4)
使用64位整数
根据在许多应用程序中的丰富经验,我建议在bigint
数据类型中以微美元(或类似的主要货币)存储值。
微型= 1百万分之一,所以1个微型美元= 0.000001美元。这样的精度足以处理不超过一美分的零钱,并且非常适合很小的单价(如广告展示次数或API费用)。
整数也很简单,很小,并且可以兼容所有内容。它们使通过计算轻松保持准确性并在最终输出中应用四舍五入。