将文字分配给 Float 时出现类型不匹配错误

Type mismatch error when assigning literal to Float

我明确指定了 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

要使用浮点数,您必须在其后缀 f:

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

默认情况下,浮点数是 Double,如异常所示。

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

Floating point literals are of type Float when followed by a floating point type suffix F or f, and are of type Double otherwise.

使用以下代码:

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

此行为已在 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)

当需要进行有损转换时,有一张警告票,但总的来说效果很好。