用整数乘以一个BigDecimal

4
我想用数量乘以一个财务金额。我知道Scala在后台使用Java的BigDecimal,但语法似乎不相同。
val price = BigDecimal("0.01") // £0.01
val qty   = 10

我试图做这件事

BigDecimal(price).*(BigDecimal(qty))

但是这是编译错误。如果我查看Java SO帖子,您可以将整数传递到BigDecimal中,然后像这样进行乘法运算。

BigDecimal(price).multiply(BigDecimal(qty))

那么在Scala中如何做到这一点呢?乘以十进制和整数会不会失去精度?我还需要将它们加在一起很多次。

2
仅仅是 price * qty 吗? - Xavier Guihot
@XavierGuihot,使用BigDecimal乘以整数时,无论在任何情况下都不会失去精度吗? - C.S
3个回答

4
您可以使用BigDecimal乘法运算符来将BigDecimalInt相乘:

def *(that: BigDecimal): BigDecimal

由于您提供的Int参数将根据以下内容进行隐式转换为BigDecimal

implicit def int2bigDecimal(i: Int): BigDecimal


因此,您可以放心地将BigDecimalInt相乘,就像处理BigDecimal一样,并且不会损失精度:BigDecimal
val price = BigDecimal("0.01")
// scala.math.BigDecimal = 0.01
val qty   = 10
// Int = 10
price * qty // same as BigDecimal("0.01").*(10)
// scala.math.BigDecimal = 0.10

1
这个问题实际上是这样的:
BigDecimal(price)

price已经是BigDecimal类型,因此编译器不知道该怎么做!如果您解决了这个问题,第一个版本就可以正常工作。第二个版本失败是因为BigDecimal上没有multiply方法。

然而,正如其他人指出的那样,简单的解决方案就是

price*qty

1
你可以这样做:
val a = 10
val b = BigDecimal(0.1000000000001)
a * b

res0: scala.math.BigDecimal = 1.0000000000010

正如您所看到的,您不会失去精度


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接