如何存储在数据库中并使用JSON传输?

在数据库中存储货币/货币值,在服务器端应用程序中处理它们,并最终通过JSON API将它们发送到浏览器的最佳做法是什么?

我已经想出了两种方法,但我不确定如何衡量利弊:

以最小货币单位将整数存储为整数

  • 基本上这意味着数据库将以美分/先令/先令等存储货币值。
  • 服务器端应用程序会将此值映射到常规整数变量。
  • JSON API会将该值表示为常规JSON号码。
  • 这种方法的不足之处在于,在存储任何用户输入之前,必须不断向用户显示货币值之前除以100,并总是乘以100。
  • 可能的陷阱:你如何定义最小的货币单位? 它是基于两位小数还是四位? 是否有任何货币不具有100:1的比率,即100美分= 1美元。
  • 将值以固定的精度和比例存储为十进制/数字

  • 数据库将货币值存储为具有固定精度和比例的小数/数字类型,例如。 NUMERIC(10,2)
  • 服务器端应用程序将这些映射到特殊对象,这些特殊对象可以在计算过程中保留精度和缩放比例。 Ruby中的BigDecimal
  • JSON API将这些值作为字符串而不是数字进行交换。 因为数字会自动被JSON解析器解析为浮点数,从而导致精度损失。
  • 这种方法的不足之处在于,服务器端的所有计算都需要在盒装数据类型(可能较慢)内发生,并且JSON解析器需要知道某些字符串实际上不是字符串,但数字值。
  • 这个好处是你不需要不断的增加和除以100。
  • 有没有一个普遍接受的最佳做法呢?


    这两种做法还有两个额外的陷阱。

    首先,并非所有货币都需要两位小数。 许多人需要三个。 更多需要零。 而一些特定领域的应用程序,例如金融和外汇,需要5或6个。

    其次,一些货币对子分类有多彩的转换​​率。 例如,老派卢比转换为16年,64年派或192派。 幸运的是,只有两个国家保留这种疯狂的转换率,如果维基百科可以通过 - 毛里塔尼亚,其中1欧里亚= 5 khoums,马达加斯加其中1 ariary = 5 iraimbilanja。

    http://en.wikipedia.org/wiki/Decimalisation

    但是,关键在于,如果您打算对您的应用进行本地化,则您的假设不应该太过以美国为中心。 至少要考虑小数位数为0,2和3的用例,并且仔细琢磨一下如果你曾经走向国际化的道路,你会选择什么样的路径。 以防万一。

    顺便说一下,还要注意Postgres中的numeric类型可以存储而不需要指定精度。 它没有更多空间可以这样做,因为它会在扩展存储空间中驻留,因为它们太大时也是如此。 而且,就像varcharvarchar(n)更好,它会更快,因为在存储数字(在这种情况下,它确实需要理性)时,您将跳过内置的精确检查。

    至于你所描述的两种方法中的哪一种最好,我已经看到了更多的第二种 - 以简化的形式。

    我强调三点:

  • 为了不在生成帐户和报告时引入舍入错误,在数据库中将货币存储为numeric (具有或不具有精度)是有意义的。 (还有一种内置的金钱类型,但我从来没有将它用于实践中用于各种非常有效的原因。)

  • 如果实际需要溢出bigint或双精度浮点数的精度(后者由js和json用于浮点数,如果使用内存),速度应该是您最担心的问题。 如果这是你的情况,任意的精确数学就是要走的路,从一端到另一端。

  • 操纵典型货币金额的典型应用程序永远不会遇到这些溢出限制。 在这里冷静一下。 除非你计划以四美元的价格存储金额,否则将无限数字转换为字符串并返回以在json中传递它们表明您正在过度设计应用程序。 如果这是你的情况,只需坚持双精度浮点运算你的应用程序。

  • 链接地址: http://www.djcxy.com/p/71313.html

    上一篇: How to store in a DB & transfer using JSON?

    下一篇: Can I compile a function with gcc and then use it with clang?