很容易创建:
object zero extends BigDecimal(java.math.BigDecimal.ZERO)
我只是想知道这是否是一种疏忽,或者是否有意识地决定不添加它,如果有的话,我有理由避免上面的代码。也许与MathContext
?
答案 0 :(得分:15)
如果我不得不猜测,那是因为获得该值的预期方式是这样的:
val zero: BigDecimal = 0
答案 1 :(得分:5)
我认为这是因为通常你不需要它。而在Java中,您需要键入类似
的内容BigDecimal b = new BigDecimal(1.23).add(BigDecimal.ZERO);
在Scala中,有数字转换意味着你可以写
val b = BigDecimal(1.23) + 0
您也可以将其简写为BigDecimal(0)
。如果您要实例化那么多,您可能希望将其作为命名值(与任何其他数字一样)进行缓存,但您通常不需要这样做,并且如果您删除特殊情况,我认为这有助于简化API必须记住。
答案 2 :(得分:0)
为了完整起见,旧线程的复活。 Scala实际上有类似于java BigDecimal.ZERO
的东西,您可以使用BigDecimalIsFractional.zero
访问它。
正如之前的答案已经指出大多数情况下文字 0
都没问题。话虽如此,Context Bounds对于通用代码非常有用:
def zero[T: Numeric](): Unit = {
val evidence = implicitly[Numeric[T]]
val zero = evidence.zero
println(s"${zero} is a ${zero.getClass.getSimpleName} defined at ${evidence.getClass.getName}")
}
zero[BigDecimal]() // 0 is a BigDecimal defined in scala.math.Numeric$BigDecimalIsFractional$
zero[Double]() // 0.0 is a Double defined in scala.math.Numeric$DoubleIsFractional$
zero[Int]() // 0 is a Integer defined at scala.math.Numeric$IntIsIntegral$