2013-05-25 3 views
2

10 진수 점 다음에 한 자릿수 만 인쇄하고 싶습니다. 인쇄 할 때 두 자리 수를 반올림하십시오.

그래서 나는 쓰기 :

double number1 = -0.049453; 
double number2 = -0.05000; 

cout.setf(ios::fixed,ios::floatfield); 
cout.precision(1); 

cout << number1 << endl; 
cout << number2 << endl; 

내 출력은 다음과 같습니다

-0.0 
-0.1 

내가 첫 번째 줄은 0.0 (-0.0 원인 것은 0.0입니다) 될 것이라고합니다. -0.0의 경우 0.0을 인쇄하는 코드를 어떻게 변경해야합니까?

두 번째 줄에 대해서는 0.0 (또는 -0.0)이 인쇄되지 않는 이유는 무엇입니까?

도움을 주셨습니다.

답변

1

부동 소수점 수를 인쇄하려면 두 개의 가능한 출력 중 "중간"보다 크거나 같으면 반올림됩니다. 따라서 -0.05은 의도적으로 -0.0이됩니다.

음수는 음수를 0으로 올림하여 의도적으로 0 일 때의 결과입니다. 내부 부동 소수점 형식 (IEEE 754)은 음수 값과 양수 값을 구별합니다 (see this link). C++ 출력 스트림이이 동작을 고수하는 것처럼 보입니다.

기호와 부동 소수점 숫자의 절대 값을 분리하여 두 가지 문제를 모두 극복 할 수 있습니다. 비교

cout << (number <= -.05 ? "-" : "") << abs(number); 

설명 : 같거나 -0.05보다 작은 숫자를 들어, abs(number) 반올림 (다음 >= 0.05입니다) 그래서에만 다음 기호를 표시 할 아닌 0이됩니다.

이 비교의 임계 값은 선택한 출력 형식에 따라 달라집니다. 따라서 플로팅 포인터를 인쇄 할 정확한 형식을 알고있는 코드에서이 인쇄 방법을 가능한 한 로컬로 유지해야합니다.

Live example

참고 : floatdouble는이 점에 대해 정확히 같은 동작합니다.

관련 문제