2

간단히 말해서 부동 소수점의 반올림 오류가 계산 후 표시되고 리터럴 저장이 아닌 이유는 무엇입니까?10 진 부동 소수점 수를 2 진수로 변환

무슨 뜻입니까? 10 진수에서 2 진수로 변환 할 때 실수로 반올림 오류가 발생하여 발생하는 문제에 대해 알고 있습니다.

자바의 예는 :

double a = 10.567; 
double b = 2.16; 
double c = a * b; 

C 대신 22.82472 다음의 값을 저장 22.824720000000003.

결과 22.82472를 double 유형의 유한 2 진수에 정확하게 저장할 수 없기 때문입니다. 그러나 어느 쪽도 10.567과 2.16을 사용할 수 없습니다 (즉 a와 b).

그러나 a 및 b 값을 인쇄하면 반올림 오류없이 정확하게 인쇄됩니다. 여기 왜 반올림 오류가 나타나지 않습니까?

즉, float 리터럴의 표현과 float 계산 결과의 표현이 어떻게 다릅니 까?

+0

출력을 반올림하는 형식입니다. 예 : C.ToString() 함수는'.TString ("R")'.' R''을 반복하면 모든 비트가 반올림되지 않고 반환 될 때'22.824720000000003'을 반환 할 때'22.82472'를 반환합니다. –

+1

@DmitryBychenko Java에서 문자열로 c 형식을 시도했지만 여전히 22.824720000000003을 반환합니다. –

답변

6

리터럴 변환시 반올림 오류가 발생하며 숨겨진 경우가 있습니다. 10.567 이진 표현, 그래서 대신은 정확한 값 (오히려 성가신 것), 알고리즘 인쇄 가장 적은 인쇄보다는 그러나

10.56700000000000017053025658242404460906982421875

을 가장 가까운 표현 가능한 double 값으로 반올림 할 수 없다 가능하면 이진수로 변환 된 경우 같은 값 (이 경우 "10.567")을 반환합니다.

doubles의 경우, 최대 15 자리의 십진수로이 작업을 수행 할 수 있습니다 (http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/ 참조).