2011-01-16 25 views
5

Aunque la situación de la conversión de Double s a BigDecimal s ha mejorado un poco en comparación con Java¿Por qué hay una conversión implícita de Float/Double a BigDecimal, pero no de String?

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

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

y cosas como

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

funcionan muy bien, ¿no sería razonable tener una conversión implícita como

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

disponible por defecto que puede convertir cadenas a BigDecimals como ¿esta?

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

O me estoy perdiendo algo y Scala resolvieron todos los "problemas" de Java con el uso del constructor BigDecimal con un valor de punto flotante en lugar de un String, y BigDecimal(String) básicamente no se necesita más en Scala?

+0

Esto tiene poco que ver con el lenguaje Java, ¿por qué debería etiquetarse "Java"? – MAK

Respuesta

7

Esto era thought of, pero al parecer rolled back porque creaba conversiones ambiguas. Ver this thread on the scala-list.

El hilo es viejo, pero por lo que puedo ver, string2Bigdecimal es still not defined as an implicit.

Si todavía quiere tener un local de string2BigDecimal implícita para su uso personal:

  • las reglas de alcance implícita se pueden encontrar en la especificación, §7.2,
  • para resolver ambigüedades en favor de su string2BigDecimal, debe definirla usando subclases, ver this paper (apartado 6.5) para un ejemplo, y this one (§ Evitar ambigüedades ) para obtener una explicación.
+0

Esto sucedió hace bastante tiempo. Recuerdo que había algo sobre poder definir una "precedencia" de implícitos con herencia en el tiempo medio. ¿No funcionaría eso aquí? ¿O es esto algo completamente diferente? – soc

+0

He actualizado mi respuesta. Espero que esto responda tus preocupaciones. – huitseeker

+0

¡Muchas gracias! ... – soc

2

Debido a que un BigDecimal puede siempre ser creados a partir de una Double o una Float, pero no siempre de una cadena. En general, es una buena idea que, cuando algo tiene esta "propiedad" para usar un implícito explícita. Por ejemplo, esto sería bueno:

"1.23".toBigDecimal 
+0

Sí, eso es ciertamente una preocupación válida, y las recomendaciones de [esta pregunta anterior] (http://stackoverflow.com/questions/1404889/scala-implicit-usage-choices) ciertamente se aplican a tener un toplevel ' string2BigDecimal' implícito. – huitseeker

Cuestiones relacionadas