我想将财务金额乘以数量。我知道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中做到这一点?像这样将十进制和整数相乘会失去精度吗?我也需要将它们加在一起
答案 0 :(得分:3)
实际上,您可以使用BigDecimal
的{{3}}将Int
与BigDecimal
相乘:
def *(that:BigDecimal):BigDecimal
由于您将提供的Int
作为参数,因此multiplication operator基于:
隐式定义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
答案 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