【问题标题】:multiplying Decimal and Integer throws "bad argument in arithmetic expression"将 Decimal 和 Integer 相乘会引发“算术表达式中的错误参数”
【发布时间】:2017-01-25 17:44:15
【问题描述】:

在我的项目中,我必须通过将十进制的价格乘以整数的数量来计算产品的总价格。当我这样做时,我得到一个异常“算术表达式中的错误参数”。怎么能解决呢?如果我必须round 结果,我不想丢失数据。

【问题讨论】:

  • 请提供有趣的代码

标签: elixir ecto


【解决方案1】:

Elixir 不允许运算符重载,因此 decimal 包无法使 * 运算符在 Decimal 上工作。该包确实提供了一个函数Decimal.mult/2 来乘以Decimal 值,它接受2 个Decimal 值,您可以使用它们。您需要先使用Decimal.new/1 将整数转换为Decimal,然后再使用Decimal.mult/2

iex(1)> d = Decimal.new("0.11111111111111111111")
#Decimal<0.11111111111111111111>
iex(2)> Decimal.mult(d, Decimal.new(3))
#Decimal<0.33333333333333333333>
iex(3)> 0.11111111111111111111 * 3 # This loses precision because Elixir's native floats are 64 bit IEEE floats
0.3333333333333333

【讨论】:

  • 抱歉,我忘了说它来自 Ecto。
  • Ecto 使用 decimal 包,所以完全相同的东西应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2012-06-21
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多