C++에서 부동 소수점(floating point) 숫자는 일반적으로 4바이트(float) 또는 8바이트(double) 크기로 저장됩니다. 따라서 무한히 긴 소수를 모두 담을 수 없고, 제한된 개수의 유효 숫자만 보관할 수 있습니다.
예를 들어 1/3 = 0.333333...처럼 소수점 이하가 무한히 이어지는 수가 있다고 가정해 봅시다. 이 값을 부동 소수점 변수에 저장하면 컴퓨터는 유한한 유효 숫자만 기록합니다. C++의 기본 정밀도(precision)는 유효 숫자 6자리이므로, 별도 설정 없이는 보통 소수점 이하 6자리까지만 표시됩니다.
setprecision으로 정밀도 변경하기
표시되는 정밀도는 setprecision 조작자(manipulator)를 사용해 자유롭게 변경할 수 있습니다. 이 함수는 <iomanip> 헤더 파일에 정의되어 있으며, cout과 함께 사용하면 출력되는 유효 숫자의 개수를 지정할 수 있습니다.
아래 예제 코드를 통해 실제 동작 방식을 확인해 보겠습니다.
예제 코드
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double x = 2.3654789d;
cout << "소수점 이하 3자리까지 출력: " << setprecision(3) << x << endl;
cout << "소수점 이하 2자리까지 출력: " << setprecision(2) << x << endl;
cout << "소수점 이하 7자리까지 출력: " << setprecision(7) << x << endl;
}실행 결과
Print up to 3 decimal places: 2.365 Print up to 2 decimal places: 2.37 Print up to 7 decimal places: 2.3654789
실행 결과 분석
- setprecision(3): 유효 숫자 3자리만 표시하여
2.365가 출력됩니다. - setprecision(2): 유효 숫자 2자리로 반올림되어
2.37이 출력됩니다. - setprecision(7): 원래 값의 전체 자릿수인
2.3654789가 그대로 표시됩니다.
추가 팁: fixed와 함께 사용하기
setprecision은 기본적으로 '유효 숫자' 개수를 의미합니다. 만약 소수점 이하 자릿수를 정확히 고정하고 싶다면 <iomanip>의 fixed 조작자를 함께 사용하면 됩니다.
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double x = 2.3654789d;
cout << fixed << setprecision(3) << x << endl; // 2.365 출력
}이처럼 C++에서는 부동 소수점의 기본 정밀도 제한을 이해하고, setprecision(필요하다면 fixed)를 적절히 활용함으로써 원하는 형식대로 숫자를 출력할 수 있습니다.