为什么Float/Double可以隐式转换为BigDecimal,但String不能?

7
尽管与Java相比,从Double转换为BigDecimal的情况有所改善。
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)

默认情况下可用,可以将字符串转换为BigDecimal,如下所示?
val numbers: List[BigDecimal] = List("1.2", "3.2", "0.7", "0.8", "1.1")

我是否漏掉了什么,Scala使用浮点数值而不是字符串来使用BigDecimal构造函数解决了Java的所有“问题”,因此在Scala中基本上不再需要BigDecimal(String)


这与Java语言本身关系不大,为什么要打上“Java”标签呢? - MAK
2个回答

8
这是 想法, 但显然因为它创建了不明确的转换而被 回滚。请参见 scala-list上的此线程
这个线程很老了,但就我所知,string2Bigdecimal 仍未被定义为隐式。
如果你仍然希望拥有一个本地的 string2BigDecimal 隐式对象供个人使用:
  • 隐式作用域的规则可以在规范 §7.2 中找到。
  • 为了有利于你的 string2BigDecimal 解决歧义,你应该使用子类定义它,参见 this paper(§6.5)中的示例,以及 this one(§Avoiding Ambiguities)中的解释。

这件事情发生了相当长的时间。我记得有关于在继承中能够定义隐式参数“优先级”的内容。这个方法是否适用于这里?还是说这是完全不同的问题? - soc

3

因为 BigDecimal 总是可以由 DoubleFloat 创建,但不总是可以由字符串创建。一般来说,在某些具有此“属性”的情况下,使用一个明确的隐式方法是一个好主意。例如,这样做会更好:

"1.23".toBigDecimal

是的,这确实是一个有效的关注点,并且此前的问题的建议当然适用于拥有一个顶级的string2BigDecimal隐式。 - Francois G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接