그래서 나는 최근에 kotlin이라는 언어를 사랑하기 시작했습니다. 오늘날, 복식을 비교하는 동안 나는 필연적으로 NaN
을 발견했습니다.Kotlin의 NaN 비교
fun main(args: Array<String>) {
val nan = Double.NaN
println("1: " + (nan == nan))
println("2: " + (nan == (nan as Number)))
println("3: " + ((nan as Number) == nan))
}
NB :
1: false
2: true
3: true
내가 자바 NaN
와 comparing가 false
을 반환 이해 : 위의 코드 수율을 실행
(Double
는Number
의 하위 유형입니다) , 그래서 나는 기대할 것이다모든 표현식에 대해.
이 동작을 어떻게 설명 할 수 있습니까? 그 이유는 무엇입니까? JVM에 double
원시적는 박스 하나에 비교 될 수 없습니다 (2) 및 (3) 원시적 권투 컴파일 된 후 Double.equals
검사가 있기 때문이다
나는 당신이 [문서]에서 다음 줄 (https://docs.oracle.com/javase/7/docs/api/java/lang/를 언급하는 경우 당신의 대답은 더 완전 할 것이라고 생각 ** doubleToLongBits'의 Double.html # doubleToLongBits (double)) : ** 모든 NaN 값이 단일 "표준"NaN 값 **으로 축소된다는 점을 제외하고 **. 그렇지 않으면 두 개의 다른 NaN이 함수와 false와 비교할 것이라고 생각할 수 있습니다. – nfs
@nrohwer, 귀하의 의견을 보내 주셔서 감사합니다, 답변을 업데이 트되었습니다. – hotkey