2011-01-16 12 views
5

Chociaż sytuacja konwersji z Double s do BigDecimal s poprawiła się nieco w porównaniu do JavyDlaczego istnieje niejawna konwersja z Float/Double na BigDecimal, ale nie z ciągu?

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

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

i rzeczy jak

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

praca naprawdę dobrze, nie byłoby rozsądne, aby mieć domyślna konwersja, taka jak

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

dostępna domyślnie, która może konwertować ciągi znaków na BigDecimals takich jak to?

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

Albo ja czegoś brakuje i Scala rozwiązać wszystkie „problemy” Java z użyciem konstruktora BigDecimal z wartości zmiennoprzecinkowej zamiast String i BigDecimal(String) nie jest w zasadzie już potrzebne w Scala?

+0

To ma niewiele wspólnego z samym językiem Java, dlaczego ma być oznaczony jako "Java"? – MAK

Odpowiedz

7

To był thought of, ale widocznie rolled back, ponieważ spowodował niejednoznaczne konwersje. Zobacz this thread on the scala-list.

Wątek jest stary, ale o ile widzę, string2Bigdecimal to still not defined as an implicit.

Jeśli nadal chcesz mieć miejscowy string2BigDecimal niejawny dla Twojego osobistego użytku:

  • zasady zakresie niejawny można znaleźć w specyfikacji, §7.2,
  • rozwiązać niejednoznaczności na korzyść swojej string2BigDecimal, powinieneś zdefiniować go za pomocą podklasy, patrz this paper (§6.5) na przykład, a this oneUnikanie niejednoznaczności) w celu wyjaśnienia.
+0

To stało się całkiem niedawno. Pamiętam, że było coś w tym, że można zdefiniować "precedens" implikacji z dziedziczeniem w międzyczasie. Czy to nie działałoby tutaj? Czy to coś zupełnie innego? – soc

+0

Zaktualizowałem moją odpowiedź. Mam nadzieję, że to rozwiąże twoje obawy. – huitseeker

+0

Wielkie dzięki! ... – soc

2

Ponieważ BigDecimal może zawsze być tworzone z Double lub Float, ale nie zawsze z ciągiem. Ogólnie dobrym pomysłem jest to, że tam, gdzie coś ma tę "właściwość", można użyć domyślnego, domyślnego,. Na przykład byłoby miło:

"1.23".toBigDecimal 
+0

Tak, to jest z pewnością ważna troska, a zalecenia [tego poprzedniego pytania] (http://stackoverflow.com/questions/1404889/scala-implicit-usage-choices) z pewnością odnoszą się do posiadania toplevel " string2BigDecimal' implicit. – huitseeker

Powiązane problemy