2011-01-16 14 views
5

Anche se la situazione di conversione da Double s per BigDecimal s è migliorata un po 'rispetto a JavaPerché esiste una conversione implicita da Float/Double a BigDecimal, ma non da String?

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

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

e cose del genere

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

lavoro molto bene, non sarebbe ragionevole avere un conversione implicita come

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

disponibile per impostazione predefinita che può convertire Stringhe in BigDecimals come Questo?

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

O mi manca qualcosa e Scala risolto tutti i "problemi" di Java con utilizzando il costruttore BigDecimal con un valore in virgola mobile al posto di un String, e BigDecimal(String) non è praticamente più necessaria a Scala?

+0

Questo ha poco a che fare con il linguaggio Java stesso, perché dovrebbe essere taggato "Java"? – MAK

risposta

7

Questo era thought of, ma apparentemente rolled back perché creava conversioni ambigue. Vedi this thread on the scala-list.

Il thread è vecchio, ma per quanto posso vedere, string2Bigdecimal è still not defined as an implicit.

Se si vuole ancora avere un locale string2BigDecimal implicita per uso personale:

  • le regole per la portata implicita può essere trovato nella specifica, § 7.2,
  • per risolvere le ambiguità a favore della vostra string2BigDecimal, è necessario definire utilizzando sottoclassi, vedere this paper (punto 6.5) per un esempio, e this oneevitare ambiguità) per una spiegazione.
+0

Questo è successo un po 'di tempo fa. Ricordo che c'era qualcosa nell'essere in grado di definire una "precedenza" degli impliciti con l'ereditarietà nel tempo medio. Non funzionerebbe qui? O è qualcosa di completamente diverso? – soc

+0

Ho aggiornato la mia risposta. Spero che questo risponda alle tue preoccupazioni. – huitseeker

+0

Grazie mille! ... – soc

2

Perché un BigDecimal può sempre essere creato da un Double o un Float, ma non sempre da una stringa. In generale, è una buona idea che, dove qualcosa ha questa "proprietà" di utilizzare un implicito esplicito. Ad esempio, sarebbe bello:

"1.23".toBigDecimal 
+0

Sì, questo è certamente un problema valido, e le raccomandazioni di [questa domanda precedente] (http://stackoverflow.com/questions/1404889/scala-implicit-usage-choices) valgono sicuramente per avere un toplevel ' string2BigDecimal' implicito. – huitseeker

Problemi correlati