将BigDecimal与整数相乘

时间:2019-05-06 10:13:03

标签: scala bigdecimal

我想将财务金额乘以数量。我知道Scala在后台使用Java的BigDecimal,但是语法似乎并不相同。

val price = BigDecimal("0.01") // £0.01
val qty   = 10

我试图这样做

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

但这是一个编译错误。如果我看一下Java SO帖子,可以将integer传递给BigDecimal,然后像这样将其相乘

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

那么您如何在Scala中做到这一点?像这样将十进制和整数相乘会失去精度吗?我也需要将它们加在一起

3 个答案:

答案 0 :(得分:3)

实际上,您可以使用BigDecimal的{​​{3}}将IntBigDecimal相乘:

  

def *(that:BigDecimal):BigDecimal

由于您将提供的Int作为参数,因此multiplication operator基于:

  

隐式定义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 :(得分:1)

您可以这样做:

val a = 10
val b = BigDecimal(0.1000000000001)
a * b

res0: scala.math.BigDecimal = 1.0000000000010

如您所见,您不会失去准确性

答案 2 :(得分:1)

问题实际上是这样的:

BigDecimal(price)

price已经是BigDecimal,因此编译器不知道该怎么做!如果您解决此问题,则第一个版本有效。第二个版本失败,因为multiply上没有BigDecimal方法。

但是,正如其他人指出的那样,简单的解决方案只是

price*qty