在数据库中存储货币/货币值,在服务器端应用程序中处理它们,最后通过JSON API将它们发送到浏览器的最佳做法是什么?
我已经找到了两种方法,但我不确定如何权衡专业人士和缺点:
BigDecimal
。是否有普遍接受的最佳做法?
答案 0 :(得分:4)
这两种做法都有两个额外的问题。
首先,并非所有货币都需要两位小数。很多人需要三个。还有更多需要零。以及一些特定于字段的应用,例如财务和外汇,需要5或6。
其次,某些货币对于次级名称具有丰富的转换率。例如,老派卢比兑换成16个annas,64个paise或192个馅饼。幸运的是,只有两个国家保留这种疯狂的转换率,如果维基百科可以通过 - 毛里塔尼亚1 ouguiya = 5 khoums,马达加斯加1 ariary = 5 iraimbilanja。
http://en.wikipedia.org/wiki/Decimalisation
但重点是,如果您打算本地化您的应用,那么您的假设不应该过于以美国为中心。至少,考虑一下你有0,2和3位小数的用例,并咀嚼一下如果你去国际,你想要采取什么样的路径。以防万一。
另外,还要注意Postgres中的numeric
类型可以在不指定精度的情况下存储。它没有更多的空间,因为当它太大时,它将驻留在扩展存储中。并且,就像varchar
更好于varchar(n)
一样,它会更快,因为在存储数字时你会跳过内置的精确检查(在这种情况下,确实需要保持正确) )。
至于你所描述的两种方法中哪一种是最好的,我已经看到了更多的第二种 - 以简化形式。
我强调三点:
在生成帐户和报告时,为了不引入舍入错误,在数据库中将货币存储为numeric
(有或没有精度)是有意义的。 (也有一种内置的金钱类型,但我从来没有看到它在实践中用于各种非常有效的原因。)
如果你真的需要溢出bigint或双精度浮点数的精度,那么速度应该是你最不担心的(后者的js和json用于浮点数,如果内存供应)。如果是这种情况,那么任意精确数学就是从一端到另一端的方式。
操纵典型货币金额的典型应用程序永远不会遇到这些溢出限制。在这里冷静一下。除非您计划以数十亿美元存储金额,否则将无界数字转换为字符串并返回以在json中传递它们表明您过度设计了应用程序。如果是这种情况,只需坚持使用双精度浮动并运送您的应用程序。