如何存储在数据库中并使用JSON传输?
在数据库中存储货币/货币值,在服务器端应用程序中处理它们,并最终通过JSON API将它们发送到浏览器的最佳做法是什么?
我已经想出了两种方法,但我不确定如何衡量利弊:
以最小货币单位将整数存储为整数
将值以固定的精度和比例存储为十进制/数字
BigDecimal
。 有没有一个普遍接受的最佳做法呢?
这两种做法还有两个额外的陷阱。
首先,并非所有货币都需要两位小数。 许多人需要三个。 更多需要零。 而一些特定领域的应用程序,例如金融和外汇,需要5或6个。
其次,一些货币对子分类有多彩的转换率。 例如,老派卢比转换为16年,64年派或192派。 幸运的是,只有两个国家保留这种疯狂的转换率,如果维基百科可以通过 - 毛里塔尼亚,其中1欧里亚= 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中传递它们表明您正在过度设计应用程序。 如果这是你的情况,只需坚持双精度浮点运算你的应用程序。
上一篇: How to store in a DB & transfer using JSON?
下一篇: Can I compile a function with gcc and then use it with clang?