Почему у Scala BigDecimal нет ZERO?

Достаточно просто создать:

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

Мне просто интересно, было ли это упущением или было сознательное решение не добавлять это, и если да, то есть ли причины, по которым мне следует избегать приведенного выше кода. Возможно, это связано с MathContext?


person pr1001    schedule 24.02.2012    source источник


Ответы (3)


Я думаю, это потому, что обычно вам это не нужно. В то время как в Java вам нужно ввести что-то вроде

BigDecimal b = new BigDecimal(1.23).add(BigDecimal.ZERO);

в Scala есть преобразования чисел, которые означают, что вы можете написать

val b = BigDecimal(1.23) + 0

Вы также можете написать это просто как BigDecimal(0). Если вы создаете много экземпляров, вы можете захотеть кэшировать его как именованное значение (как и для любого другого числа), но обычно вам это не нужно, и я думаю, что это помогает упростить API, если вы удаляете особые случаи, которые вы должны помнить.

person Luigi Plinge    schedule 24.02.2012

Если бы мне пришлось угадывать, это потому, что ожидаемый способ получить это значение был бы таким:

val zero: BigDecimal = 0
person Ian McLaird    schedule 24.02.2012
comment
Хорошая точка зрения. Спасибо за ваш ответ, но я принимаю ответ Луиджи, потому что считаю его более подробным и более полезным для будущих посетителей. - person pr1001; 28.02.2012

Воскрешение старой темы для полноты картины. На самом деле в 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$
person Anthony Accioly    schedule 26.03.2018