Почему существует неявное преобразование из Float / Double в BigDecimal, но не из String? - PullRequest
6 голосов
/ 16 января 2011

Хотя ситуация с Double с в BigDecimal с немного улучшилась по сравнению с Java

scala> new java.math.BigDecimal(0.2)
res0: java.math.BigDecimal = 0.20000000000000001110223024625156...

scala> BigDecimal(0.2)
res1: scala.math.BigDecimal = 0.2

и тому подобные

val numbers: List[BigDecimal] = List(1.2, 3.2, 0.7, 0.8, 1.1)

работает очень хорошо, не было бы разумно иметь неявное преобразование, подобное

implicit def String2BigDecimal(s: String) = BigDecimal(s)

доступно по умолчанию, которое может конвертировать строки в большие десятичные числа, как это?

val numbers: List[BigDecimal] = List("1.2", "3.2", "0.7", "0.8", "1.1")

Или я что-то упустил, и Scala разрешил все «проблемы» Java с помощью конструктора BigDecimal со значением с плавающей запятой вместо String, а BigDecimal(String) в Scala больше не требуется? *

Ответы [ 2 ]

8 голосов
/ 16 января 2011

Это была мысль о , но, очевидно, откат , потому что это создавало неоднозначные преобразования. См. эту тему в scala-list .

Поток старый, но, насколько я вижу, string2Bigdecimal равен , но не определен как неявный .

Если вы все еще хотите иметь локальный string2BigDecimal неявный для личного использования:

  • правила для неявной области видимости можно найти в спецификации, §7.2,
  • Чтобы устранить неоднозначности в пользу вашего string2BigDecimal, вы должны определить его, используя подклассы, см. этот документ (§6.5) для примера, и этот Избегание неясностей ) для объяснения.
2 голосов
/ 16 января 2011

Поскольку BigDecimal может всегда быть создан из Double или Float, но не всегда из строки.В общем, хорошая идея, что где-то есть это «свойство» использовать явное неявное .Например, это было бы неплохо:

"1.23".toBigDecimal
...