将 Decimal 和 Integer 相乘抛出 "bad argument in arithmetic expression"
multiplying Decimal and Integer throws "bad argument in arithmetic expression"
在我的项目中,我必须通过将小数形式的价格乘以整数形式的数量来计算产品的总价。当我这样做时,出现异常 "bad argument in arithmetic expression"。怎么解决呢?如果我必须 round
结果,我不想丢失数据。
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
在我的项目中,我必须通过将小数形式的价格乘以整数形式的数量来计算产品的总价。当我这样做时,出现异常 "bad argument in arithmetic expression"。怎么解决呢?如果我必须 round
结果,我不想丢失数据。
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