Ошибка несоответствия типов при назначении литерала Float - PullRequest
2 голосов
/ 01 марта 2020

Я явно указал тип 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

Ответы [ 3 ]

4 голосов
/ 01 марта 2020

Используйте следующий код:

val f: Float = 3f

Если вы не добавите суффикс f, переменная будет считаться двойной.

Это то же самое, что происходит в 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
3 голосов
/ 01 марта 2020

Чтобы иметь число с плавающей точкой, вы должны суффиксить его f:

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

По умолчанию плавающее число равно Double, как предполагает исключение.

С литералы с плавающей точкой (предоставлено Mario Gali c):

Литералы с плавающей точкой имеют тип Float, когда за ними следует суффикс типа F или f с плавающей точкой, и являются типа Double в противном случае.

2 голосов
/ 01 марта 2020

Это поведение исправлено в Scala 3 (Дотти):

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)

Существует открытый билет, чтобы предупредить, когда требуется преобразование с потерями, но в целом это работает довольно хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...