Why is there an implicit conversion from Float/Double to BigDecimal, but not from String?
Although the situation of conversion from Double
s to BigDecimal
s has improved a bit compared to Java
scala> new java.math.BigDecimal(0.2)
res0: java.math.BigDecimal = 0.20000000000000001110223024625156...
scala> BigDecimal(0.2)
res1: scala.math.BigDecimal = 0.2
and things like
开发者_StackOverflowval numbers: List[BigDecimal] = List(1.2, 3.2, 0.7, 0.8, 1.1)
work really well, wouldn't it be reasonable to have an implicit conversion like
implicit def String2BigDecimal(s: String) = BigDecimal(s)
available by default which can convert Strings to BigDecimals like this?
val numbers: List[BigDecimal] = List("1.2", "3.2", "0.7", "0.8", "1.1")
Or am I missing something and Scala resolved all "problems" of Java with using the BigDecimal
constructor with a floating point value instead of a String
, and BigDecimal(String)
is basically not needed anymore in Scala?
This was thought of, but apparently rolled back because it created ambiguous conversions. See this thread on the scala-list.
The thread is old, but as far as I can see, string2Bigdecimal is still not defined as an implicit.
If you still want to have a local string2BigDecimal
implicit for your personal use:
- the rules for implicit scope can be found in the specification, §7.2,
- to resolve ambiguities in favor of your
string2BigDecimal
, you should define it using subclassing, see this paper (§6.5) for an example, and this one (§ Avoiding Ambiguities) for an explanation.
Because a BigDecimal
can always be created from a Double
or a Float
, but not always from a String. In general, it is a good idea that, where something has this "property" to use an explicit implicit. For example, this would be nice:
"1.23".toBigDecimal
精彩评论