将文字分配给 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,因为 Double
和 Float
覆盖了 java 的 double
和 float
分别为:
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)
当需要进行有损转换时,有一张警告票,但总的来说效果很好。
我明确指定了 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,因为 Double
和 Float
覆盖了 java 的 double
和 float
分别为:
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)
当需要进行有损转换时,有一张警告票,但总的来说效果很好。