7

虽然从Doubles 到BigDecimals 的转换情况相比 Java 有所改善

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)

默认情况下可用,它可以像这样将字符串转换为 BigDecimals?

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

或者我是否遗漏了一些东西,Scala 使用BigDecimal带有浮点值而不是 a 的构造函数解决了 Java 的所有“问题” String,并且BigDecimal(String)在 Scala 中基本上不再需要?

4

2 回答 2

8

这是考虑过的,但显然回滚了,因为它产生了模棱两可的转换。请参阅scala-list 上的此线程

该线程很旧,但据我所知, string2Bigdecimal仍未定义为隐式.

如果您仍然希望有一个本地string2BigDecimal隐式供您个人使用:

  • 隐式范围的规则可以在规范中找到,§7.2,
  • 要解决有利于您的歧义string2BigDecimal您应该使用子类定义它,请参阅本文 (第 6.5 节)以获取示例,以及论文(第 6.5节)以获取解释。
于 2011-01-16T11:51:22.843 回答
3

因为 a总是BigDecimal可以从 a或 a创建,但并不总是从 String 创建。一般来说,这是一个好主意,如果某物具有这种“属性”,可以使用显式隐式. 例如,这会很好:DoubleFloat

"1.23".toBigDecimal
于 2011-01-16T19:54:28.380 回答