Почему в 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.
Для более безопасного равных используйте ===
из Скалаза