为什么Scala的BigDecimal没有ZERO?

时间:2012-02-24 18:08:51

标签: scala bigdecimal

很容易创建:

object zero extends BigDecimal(java.math.BigDecimal.ZERO)

我只是想知道这是否是一种疏忽,或者是否有意识地决定不添加它,如果有的话,我有理由避免上面的代码。也许与MathContext

有关

3 个答案:

答案 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$