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

标签 scala floating-point implicit bigdecimal

虽然从Double转换的情况转至 BigDecimal s 与 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 解决了 Java 的所有“问题”带有浮点值而不是 String 的构造函数, 和 BigDecimal(String)在 Scala 中基本上不再需要了?

最佳答案

这是 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 (§ 避免歧义)的解释。
  • 关于scala - 为什么有从 Float/Double 到 BigDecimal 的隐式转换,而不是从 String 的隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705057/

    相关文章:

    bash - 我怎样才能在 Bash 中进行 float 比较?

    javascript - 如何避免 Javascript 奇怪的 Float 行为?

    .net - 隐式运算符和 TypeConverters 是否等效?

    scala - 检索将分配给 Scala 宏调用的值的名称

    scala - 用不可变对象(immutable对象)模拟继承+可变状态

    scala - 在scala中抓取进程stderr

    database - 如何创建至少 11 位数字的 Oracle 编号?

    scala - 有没有办法覆盖并向方法添加一些隐式?

    scala - 隐式的范围

    Scala 任务与参与者的并行化 => 调度程序如何工作?