【问题标题】:Why is there an implicit conversion from Float/Double to BigDecimal, but not from String?为什么有从 Float/Double 到 BigDecimal 的隐式转换,而不是从 String 的隐式转换?
【发布时间】:2011-01-16 11:31:37
【问题描述】:

虽然从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)

默认可用,可以像这样将Strings转换为BigDecimals?

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

或者我错过了什么,Scala 使用带有浮点值的 BigDecimal 构造函数而不是 String 解决了 Java 的所有“问题”,而在 Scala 中基本上不再需要 BigDecimal(String) 了吗?

【问题讨论】:

  • 这和Java语言本身关系不大,为什么要标记为“Java”?

标签: scala floating-point implicit bigdecimal


【解决方案1】:

这是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避免歧义) 进行解释。

【讨论】:

  • 这是很久以前的事了。我记得有一些关于能够同时定义隐含和继承的“优先级”。这不在这里工作吗?或者这是完全不同的东西?
【解决方案2】:

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

"1.23".toBigDecimal

【讨论】:

  • 是的,这当然是一个有效的问题,this previous question 的建议当然适用于隐含的顶级 string2BigDecimal
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2021-06-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多