将 BigDecimal 与整数相乘

Multiply a BigDecimal with an Integer

我想将财务金额乘以数量。我知道 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 中做到这一点?像这样将小数和整数相乘会失去精度吗?我也需要把很多这些加在一起[=13​​=]

你可以这样做:

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

res0: scala.math.BigDecimal = 1.0000000000010

如您所见,您不会失去精度

您实际上可以使用 BigDecimalmultiplication operator:

BigDecimalInt 相乘

def *(that: BigDecimal): BigDecimal

因为您将提供的 Int 作为其参数 implicitly converted to a 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

其实问题是这样的:

BigDecimal(price)

price 已经是 BigDecimal 所以编译器不知道该做什么!如果你解决了这个问题,第一个版本就可以工作了。第二个版本失败,因为 BigDecimal.

上没有 multiply 方法

然而,正如其他人所指出的,简单的解决方案只是

price*qty