【问题标题】:Type mismatch error when assigning literal to Float将文字分配给 Float 时出现类型不匹配错误
【发布时间】:2020-03-01 07:21:22
【问题描述】:

我明确指定了float 类型。此代码产生错误。为什么?

目前,我正在使用 scala v2.12.8

scala> val f: Float = 3.0
<console>:11: error: type mismatch;
 found   : Double(3.0)
 required: Float
       val f: Float = 3.0

【问题讨论】:

标签: java scala math floating-point double


【解决方案1】:

使用以下代码:

val f: Float = 3f

如果不加f后缀,变量会被当做double处理。

在 java 中也发生同样的事情,因为 DoubleFloat 分别覆盖了 java 的 doublefloat

jshell> float f = 3.0
|  Error:
|  incompatible types: possible lossy conversion from double to float
|  float f = 3.0;
|            ^-^

jshell> float f = 3.0f
f ==> 3.0

【讨论】:

    【解决方案2】:

    要拥有一个浮点数,您必须在其后缀 f

    scala> val f: Float = 3.0f
    f: Float = 3.0
    

    默认情况下,浮点数是Double,如例外所示。

    来自floating-point-literals(Mario Galic 提供):

    当后面跟一个浮点数时,浮点字面量是 Float 类型 点类型后缀为 F 或 f,否则为 Double 类型。

    【讨论】:

      【解决方案3】:

      Scala 3 (Dotty) 中已修复此行为:

      Starting dotty REPL...
      Dotty compiler version 0.22.0-RC1 -- Copyright 2002-2020, LAMP/EPFL
      scala> val x: Float = 3.14
      val x: Float = 3.14
      
      scala> Seq(3.14, 1)
      val res0: Seq[Double] = List(3.14, 1.0)
      
      scala> Seq[Float](3.14, 1)
      val res1: Seq[Float] = List(3.14, 1.0)
      

      它不会为会导致有损转换的文字推断类型:

      scala> Seq(3.14f, 2147483646)
      val res2: Seq[AnyVal] = List(3.14, 2147483646)
      
      scala> Seq(3.14f, 2147483647)
      val res3: Seq[Float] = List(3.14, 2147483647)
      

      当需要进行有损转换时,会发出警告,但总的来说效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        相关资源
        最近更新 更多