Почему у Scala BigDecimal НОЛЬ? - PullRequest
       15

Почему у Scala BigDecimal НОЛЬ?

8 голосов
/ 24 февраля 2012

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

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

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

Ответы [ 3 ]

15 голосов
/ 24 февраля 2012

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

val zero: BigDecimal = 0
5 голосов
/ 25 февраля 2012

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

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

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

val b = BigDecimal(1.23) + 0

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

0 голосов
/ 26 марта 2018

Воскрешение старой нити ради полноты. Scala на самом деле имеет что-то похожее на java BigDecimal.ZERO, вы можете получить к нему доступ с помощью BigDecimalIsFractional.zero.

Как уже указывалось в предыдущих ответах, в большинстве случаев литерал 0 будет в порядке. Сказав это, границы контекста могут быть полезны с общим кодом:

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$
...