2017-03-19 4 views
3

두 개의 long 값의 지수 부분 (모듈로 1)을 가져 오려고합니다.Java에서 longs 나누기 분수 가져 오기

long dividend = 50L; 
long divisor = 3L; 
float n1 = (dividend % divisor)/(float) divisor; 
float n2 = (dividend/(float) divisor) % 1; 
System.out.println(n1); 
System.out.println(n2); 

위의 내용은 다음과 같이 인쇄됩니다.

0.6666667 
0.66666603 

부동 소수점 정밀도가 어떻게 작동하는지 잘 모른다.

왜 두 번째 (더 명확한) 구현이 첫 번째 구현보다 덜 정확합니까?

+3

'float'은 6 ~ 9 자리의 십진수 만 사용할 수 있기 때문에. 50/3은 16.666666이지만 정수 부분을 제거하여 0.666666이되면 마지막 자리를 넘어서는 'float'의 부정확성이 분명 해집니다. 먼저 계산 한 다음 자릿수를 제거하면 정밀도가 떨어집니다. 예 : 부동 소수점 숫자가 왜 부정확합니까?] (http://stackoverflow.com/q/21895756/5221149) – Andreas

+0

우우, 알았어! 고맙습니다! 또한 더 많은 독서에 대한 링크에 감사드립니다. 답변을 게시하려면 동의하겠습니다. 그렇지 않으면 나중에 쓸 수 있습니다. 다시 한 번 감사드립니다! –

답변

0

float에는 10 진수의 6 자리가 있습니다.

첫 번째 계산에서 부동 소수점 나누기가 마지막으로 발생하므로 전체 부동 소수점 정밀도가 있습니다.

두 번째 계산에서 float 나누기가 발생하고 정수 부분이 사라져서 이후 숫자의 부정확성이 노출됩니다.
정수 부분이 정밀도의 일부 였으므로 이제 해당 숫자가 손실됩니다.

보다 나은 결과를 얻으려면 dividend을 더 큰 숫자로 설정하고 정확도를 낮추십시오.

@Andreas의 답변에 감사드립니다.