为什么有从Float / Double到BigDecimal的隐式转换,而不是从String?

时间:2011-01-16 11:31:38

标签: scala floating-point implicit bigdecimal

虽然与Java相比,从Double转换为BigDecimal s的情况有所改善

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解决了Java的所有“问题”,使用BigDecimal构造函数使用浮点值而不是String,基本上不需要BigDecimal(String)在斯卡拉?

2 个答案:

答案 0 :(得分:8)

这是thought of,但显然是rolled back,因为它创建了模棱两可的转化。请参阅this thread on the scala-list

线程是旧的,但据我所知,string2Bigdecimal是still not defined as an implicit

如果您仍希望隐藏本地string2BigDecimal供您个人使用:

  • 隐式范围的规则可以在规范§7.2,
  • 中找到
  • 要解决有关您string2BigDecimal的歧义,您应该使用子类定义它,请参阅this paper (§6.5)示例和this one(§避免歧义)以获得解释。

答案 1 :(得分:2)

因为BigDecimal 始终始终DoubleFloat创建,但并非始终来自字符串。一般来说,有一个好的想法是,某些东西具有使用显式隐式的“属性”。例如,这很好:

"1.23".toBigDecimal