将 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
如您所见,您不会失去精度
您实际上可以使用 BigDecimal
的 multiplication operator:
将 BigDecimal
与 Int
相乘
def *(that: BigDecimal): BigDecimal
因为您将提供的 Int
作为其参数 implicitly converted to a BigDecimal
基于:
implicit def int2bigDecimal(i: Int): BigDecimal
因此,您可以安全地将 BigDecimal
与 Int
相乘,就好像它是 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
我想将财务金额乘以数量。我知道 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
如您所见,您不会失去精度
您实际上可以使用 BigDecimal
的 multiplication operator:
BigDecimal
与 Int
相乘
def *(that: BigDecimal): BigDecimal
因为您将提供的 Int
作为其参数 implicitly converted to a BigDecimal
基于:
implicit def int2bigDecimal(i: Int): BigDecimal
因此,您可以安全地将 BigDecimal
与 Int
相乘,就好像它是 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