【问题标题】: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 中也发生同样的事情,因为 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
【解决方案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)
当需要进行有损转换时,会发出警告,但总的来说效果很好。