Почему в scala верно сравнение между целым числом и числом с плавающей запятой, например 71 == 71.0?

Я получил это в интерпретаторе Scala:

scala> val a:Float = 71F; val b:Int = 71; if (a==b) println ("?")
?
a: Float = 71.0
b: Int = 71

И мне было интересно, какова точная семантика этого сравнения. Несмотря на то, что у меня есть поверхностные знания о Scala, я предполагаю, что арифметика с плавающими числами (и в этом случае я стараюсь не использовать что-то эквивалентное BigDecimal Java, или, по крайней мере, так я думаю) применима к этому примеру. Таким образом, "а" не содержит число 71, как "б", но что-то близко к нему.

Я думаю, что если сделать любое целое число для сравнения с плавающей точкой ложным, это упростило бы ситуацию, но я уверен, что что-то упустил

Интересно, может ли это привести к ошибкам в коде?

2 ответа

Решение

То же самое происходит в Java, как указано в JLS 15.21.1. Scala, вероятно, наследует эту семантику для совместимости.

Этот компортмент унаследован от Java из-за неявного преобразования, как вы можете видеть в Scaladoc

Implicit information
    This member is added by an implicit conversion from Int to Integer performed by method int2Integer in scala.Predef. 

Для более безопасного равных используйте === из Скалаза

Другие вопросы по тегам