2012-11-07 1 views
2

후 예상 번호가 아닙니다 : 부동 소수점 수는 나는 다음과 같은 문이 뺄셈

float diff = tempVal - m_constraint.getMinVal(); 

tempVal

이 float로서 선언되고 getMinVal()는 부동 소수점 값을 반환합니다.

난 다음 프린트 아웃있다 : I은 DIFF0.1 아니라 전술이다

DIFF = 0.099999905, tempVal = 5.1 m_constraint.getMinVal() =

5.0 기대 번호. 그렇게하는 방법?

+3

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Mysticial

답변

0

당신은 얻을 수 없다 exact 결과는 float입니다. 이를 위해 FixedPoint 라이브러리를 사용해야 할 수도 있습니다. 참조 : http://sourceforge.net/projects/jmfp/

0

Java는 IEEE 754에 정의 된 2 진 부동 소수점 표현을 사용하여 실수를 인코딩합니다. 모든 유한 표현과 마찬가지로 잠재적 표현보다 훨씬 많은 실제 숫자가 있기 때문에 모든 실수를 정확하게 표현할 수 없습니다. 정확히 나타낼 수없는 숫자 (귀하의 경우 0.1)는 가장 가까운 표현 가능한 숫자로 반올림됩니다.

0

값을 내부적으로 저장하는 방식 때문에 수레와 복식은 2의 거듭 제곱의 합계로 분해 될 수있는 숫자를 완전히 정확하게 저장할 수 있습니다 (그리고 나서 절대 및 상대 크기와 관련된 특정 제약 내에서).

정확한 저장이 불가능한 숫자를 저장하거나 계산을 시도하면 최종 숫자에 오류가 발생합니다.

보통 이것은 당신이 수레를 사용하여 제공 문제가되지 않습니다 몇 가지주의와 복식 :

  • 는 당신이 필요로하는 것 이상의 정밀도 "예비"숫자를 가지고 원시적 인 부동 소수점의 크기를 사용한다; 많은 응용 프로그램

  • 이 아마 모든에 플로트를 사용 (더블 대신 사용)하지 않는 의미가 매우 좋지 정밀도를 가지고 있으며, 사업부를 제외하고, 많은 프로세서 성능에 이점이 없다

  • FP 번호를 인쇄 할 때 실제로 필요한 숫자의 자릿수 만 고려하고 확실히 마지막 자릿수는 포함하지 마십시오 (String 사용).당신을 도울 수있는 형식);

  • 임의의 자릿수의 자릿수가 필요한 경우 BigDecimal을 대신 사용하십시오.