【问题标题】:What is the recommended data type for handling Money (just 2-decimal places) in Elixir/Erlang?在 Elixir/Erlang 中处理 Money(只有 2 位小数)的推荐数据类型是什么?
【发布时间】:2020-03-12 10:50:41
【问题描述】:

在 Elixir/Erlang 中处理 Money 的推荐数据类型 - 仅包含 2 位小数的数值是什么?

【问题讨论】:

  • 我试过十进制,在混合数值数据上使用 Enum.reduce 时遇到问题
  • 您可以始终确保您使用的数据是 Decimal 结构。
  • @CharlesOkwuagwu Justin 可能意味着r.data |> Enum.map(&Decimal.new/1) |> Enum.reduce(Decimal.new(0), &sum.(&1, &2))。即使r.data 包含本地数字类型和Decimals 的混合,这也将起作用。
  • 那么然后将 1 转换为 Decimal 并使用 Decimal.add 和类似的功能。

标签: erlang elixir


【解决方案1】:

我认为在处理金钱时应该始终使用整数。浮点运算可能会出现舍入错误,而且即使相差 1 美分的货币处理代码通常也不好。例如,而不是

amount = 99.99

使用

amount_cents = 9999

如果您将金额存储在数据库中,这一点非常重要,因为 Elixir 和您的数据库之间的转换可能会产生不良结果。

【讨论】:

  • 你是对的,但你可以想象我在处理时需要添加的额外层......
  • 和处理金钱(2 位十进制数据)很常见,在任何语言中都是一流的
  • 金钱是一个非常复杂的话题,大量的应用程序从不需要它(我已经两年多没有写过任何与金钱有关的代码了),因此不应该真正属于一种语言的核心库。我曾经在一个系统上工作过,我们实际上需要比美分更小的精度,例如 - 在标准库中拥有所有这些要求可能会使它无法使用(我们为此使用整数 - 它通常是最简单的解决方案,除非货币,等等,发挥重要作用,我通常建议,尤其是内置 bignum 库)
  • 是的。将它包装在一个模块中,它既简单又快速。当你使用浮点数时,你不会遇到所有的舍入废话。当然,YMMV - 与金钱相关的计算、性能问题等等的需求有多广泛。但我通常会从这里开始,除非我正在编写与会计相关的软件(然后我想要一个合适的库,这里其他人指出的库之一)。
  • @CharlesOkwuagwu 我认为您从未在金融行业工作过。适当的舍入和缩放可以等于数百万美元。
【解决方案2】:

我强烈推荐使用 Decimal 库。处理所有困难的边缘情况已经投入了大量的思想和工作。

金钱,就像密码学一样,不是你应该自己实现的东西。你会弄错的。

【讨论】:

  • 十进制库很酷。但仔细想想,如果所讨论的货币确实只准确/可用到最接近的美分......那么以美分为单位的直整数 mth 的好处开始变得很有意义。
【解决方案3】:

使用 Decimal 库是货币处理逻辑的方法, 尤其是当您必须对数量进行算术运算时。

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 2013-07-18
    • 2011-06-28
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多