1

저는 Java 7 64 비트로 LibGDX 프로그램을 만들고 있습니다.자바 7 123.123456f에 123.12346이있는 이유는 무엇입니까?

매개 변수로 float을받는 함수를 junit을 사용하여 테스트 할 때 이상한 결과가 나타납니다. 나는 함수를 123.123456f을 매개 변수로 사용하고 함수는 123.12346을받습니다. 왜 이런 일이 생길까요?

12.123456f을 매개 변수로 사용하면 올바른 결과를 얻습니다. 123.12345f 여전히 작동합니다.

따라서 입력을 확인하려면 System.out.println(...)을 사용합니다.

나에게 중요하지 않지만 그 이유를 알고 싶습니다. 고마워요!

감사 안토니

+1

[모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

이 " 문제 "를 일으킬 수 있습니다. 부동 소수점 유형에는 무한 정밀도가 없습니다. 수레는 24 비트의 가수를 가지고 있으며 6-7 자리의 정밀도 만 가질 수 있습니다. –

답변

3

f 단일 IEEE-754 정밀도 부동 소수점 수를 의미 float 의미한다. 그것들은 정확하지는 않지만 유효 숫자는 대략 7 자리뿐입니다. double에 대해 d을 사용하여 배가 (!) 할 수 있습니다. 배정 밀도 부동 소수점 숫자는 약 15 자리의 정밀도를 제공합니다. 물론 이것을 전달하면 double 초를 받아 들일뿐 아니라 float 초가 걸립니다. 합리적인 정확도가 필요한 경우에는 정확해야합니다.

두 배로도 문제가 있음을 유의하십시오. 그들은 정밀도, 완벽한 정밀도가 없습니다. IEEE-754 부동 소수점은 신속한 계산과 컴팩트 한 저장을 위해 설계되었습니다. 복식을 사용하는 고전적인 부정확도 예제는 0.1 + 0.2이며 0.30000000000000004입니다.

통화 수치를 다루는 경우 (해당 도서관에서 그렇지 않은 것으로 생각합니다) BigDecimal을 보면 더 잘 작동하는 것처럼 임의의 자릿수를 사용할 수 있습니다. 그들은 훨씬 더 크고 훨씬 느리고 자신의 쟁점을 가지고 있습니다 (정확하게 1/3을 정확하게 표현할 수 없다는 사실과 같은)하지만 통화의 경우 더 나은 선택이 될 수 있습니다.

+0

당신의 대답은 수레가 쓸모없고 두배로 모든 문제를 해결할 것 같은데요. 일반적으로 수레가 충분하기 때문에 정확한 값을 원할 경우 복식은 같은 문제가 발생합니다. 적어도 BigDecimal에 힌트를 추가해야합니다. – noone

+0

@noone :'BigDecimal'은 당연히'1/3'을 정확하게 표현하는 것과 같은 자체 문제를 가지고 있습니다. :-) 나는 복식이 모든 문제를 해결했다고는 생각하지 않는다. 그러나 그들은 싱글보다 더 정확합니다. –