2014-01-25 10 views
2

이 코드 행의 경우 출력이 모두 0 인 백을 얻을 수 있습니다. 이제 올바르게 이해한다면 ab와 c는 실제 값의 약간 다른 버전을 저장할 수 있습니다 .3 따라서이 값에 대해 Float.compare (...)를 수행하면 출력 값으로 0이 아닌 값이 반환 될 것으로 예상됩니다. 왜 나는 그것들을 0으로 가져 옵니까?부동 소수점 연산 및 부동 소수점 값 비교

float a = 0.15f + 0.15f; 
float b = 0.1f + 0.2f; 
float c = 0.3f; 
System.out.println(Float.compare(a, b)); //<--- outputs 0 
System.out.println(Float.compare(a, c)); //<--- outputs 0 
System.out.println(Float.compare(b, c)); //<--- outputs 0 
+1

그냥 있기 때문에 특정 경우에 충분히 정확하지 않습니다 것을 의미하지 않는다. –

+2

'double' 값은'-0.1d + 0.2d'의 결과가'0.30000000000000004'이므로'-1','0','1'을 얻을 수 있습니다. 다른 숫자는 '0.3'). – Pshemo

+0

@Pshemo :'0.1d'는 0.1f만큼 부정확하며 소수 자리가 더 많습니다. 부동 소수점 정밀도는 0.1을 나타낼 수 없으며 기본 -2의 반복 시리즈입니다. –

답변

1

당신이 말한대로, 때문에, 그들은 수도 가게 약간 다른 버전. 그러나이 간단한 표현식을 사용하면 정밀도가 손실되지 않으므로 a, b 및 c 모두 정확히 동일한 버전의 .3f을 포함합니다.

재미있게 해보기 위해 시도해보십시오. 여기 정밀도를 잃게됩니다, 및 비교의 결과는 0되지 않습니다 : 부동 소수점하는 것은 일반적으로 충분히 정확하지 않습니다

public static void main(String[] args) { 
    float a = .3f; 
    float b = .3f; 
    a = (float) Math.cos(a); 
    a = (float) Math.acos(a); 
    System.out.println(Float.compare(a, b)); 
}