PostgreSQL:哪种数据types应该用于货币?

看起来像Moneytypes是不鼓励的,如这里所述

我的应用程序需要存储货币,我应该使用哪种数据types? 数字,金钱还是FLOAT?

数字强制2单位精度。 不要使用float或floattypes的数据types来表示货币,因为如果你这样做的话,当财务报告的底线数字被+或 – 几美元不正确的时候,人们将会不高兴。

据我所知,金钱types只是由于历史原因而留下的。

你的来源绝不是官方的。 它可以追溯到2011年,我甚至不认识这些作者。 如果钱的types是“不鼓励”的PostgreSQL会在手册中这么说 – 事实并非如此 。

对于更多的官方消息来源 ,请阅读pgsql-general(从本周开始!)的核心代码,核心开发人员包括D'Arcy JM Cain(原始作者)和Tom Lane:

基本上, money有其(有限的)用途。 与numeric相比的优点是性能

decimal只是Postgres中的numeric的别名。

有关最近发布的改进的相关答案(和评论!):

  • 贾斯珀报告:无法获得类'org.postgresql.util.PGmoney'字段'x'的值

我个人喜欢将货币存储为代表Cents的integer 。 这比其他任何提到的选项更有效率。

您的select是:

  1. integer :存储以美分为单位的金额。 这是EFTPOS交易使用的。
  2. decimal(12,2) :存储精确到两位小数的金额。 这是大多数总账软件使用的。
  3. float :可怕的想法 – 准确度不够。 这是天真的开发人员使用的。

选项2是最常用和最容易处理的。 把精度(在我的例子中是12,意思是总共12位数)尽可能大或小,这对于你来说是最合适的。

请注意,如果您将计算结果(如涉及汇率)的多个交易汇总为具有商业含义的单个值,则精度应该更高以提供准确的macros观值; 考虑使用像decimal(18, 8)这样的总和是准确的,并且各个值可以四舍五入到分精度显示。

我把所有的货币领域都保留下来:

numeric(15,6)

有这么多的小数位似乎过分,但如果有一点机会,你将不得不处理多种货币,你将需要转换的精度。 无论我提出的用户,我总是存储到美元。 以这种方式,我可以随时转换成任何其他货币,因为当天的兑换率。

如果除了一种货币之外你什么都不做,那么最糟糕的是你浪费了一点空间来存储一些零。