도입: 왜 소수점 자릿수를 제어해야 하는가
cin, cout을 사용할 때 입력은 비교적 단순하지만, 실수(부동소수점) 출력은 기본 설정만으로는 원하는 형식을 얻기 어렵다. 알고리즘 문제에서 소수점 N자리까지 출력하거나, 로그·리포트에서 일정한 자릿수로 맞추려면 **정밀도(precision)**와 **표기 방식(fixed / default)**을 명시적으로 다뤄야 한다. 이 글에서는 std::cout.precision()과 std::fixed의 의미, 차이, 그리고 소수점을 “고정”했다가 다시 “해제”하는 방법까지 예시와 함께 정리한다.
핵심 개념: precision과 fixed
C++ 스트림에서 실수 출력 자릿수를 다루는 요소는 두 가지다.
| 요소 | 역할 |
|---|---|
std::cout.precision(n) | 실수 출력 시 총 유효 자릿수를 n으로 설정 (소수점 “아래”만이 아님) |
std::fixed | 고정 소수점 표기로 전환. 이후에는 precision(n)이 “소수점 이하 n자리”를 의미함 |
즉, precision만 쓸 때는 “숫자 전체에서 의미 있는 자릿수”를 제한하고, fixed를 켠 뒤 precision을 쓰면 “소수점 이하 자릿수”를 고정한다.
출력 방식 선택 흐름
어떤 경우에 precision만 쓰고, 어떤 경우에 fixed까지 켜야 하는지 아래처럼 정리할 수 있다.
flowchart LR
subgraph ReqGroup["요구사항"]
NeedFix["소수점 이하 자릿수고정 필요?"]
end
subgraph SelGroup["선택"]
YesFix["예"]
NoFix["아니오"]
end
subgraph ActGroup["조치"]
UseFixed["std::fixed 사용 후precision 설정"]
UsePrecOnly["precision만 설정전체 유효자리 제어"]
end
NeedFix --> YesFix
NeedFix --> NoFix
YesFix --> UseFixed
NoFix --> UsePrecOnly
- 소수점 이하 자릿수를 정확히 고정해야 하면 →
std::fixed사용 후precision(n). - 전체 유효 자릿수만 제한하면 될 때 →
precision(n)만 사용.
precision만 사용할 때: 전체 유효 자릿수
precision(n)은 “출력되는 실수 전체에서 의미 있는 자릿수를 n개로 제한”한다. 소수점 아래 n자리가 아니다.
| |
정수 부분이 크면 소수 부분이 잘리고, 작은 수는 소수 쪽으로 더 많이 나온다. 오차 범위를 넓게 두고 싶다면 precision 인자를 크게 주면 된다. 반대로 “소수점 아래 정확히 N자리”를 원한다면 이 방식만으로는 부족하다.
fixed 사용: 소수점 이하 자릿수 고정
std::fixed는 고정 소수점 표기를 켠다. 이 상태에서는 precision(n)이 “소수점 이하 n자리”를 의미한다.
| |
요약하면 다음과 같다.
- fixed 적용 전:
precision(6)→ 전체 유효 자릿수 6. - fixed 적용 후:
precision(6)→ 소수점 이하 6자리. - fixed 해제:
std::cout.unsetf(std::ios::fixed)로 원래 기본 부동소수점 출력으로 되돌린다.
fixed 해제와 스코프 관리
std::fixed는 스트림에 설정되므로, 한 번 켜두면 이후 같은 스트림의 모든 실수 출력에 적용된다. 특정 구간에서만 소수점을 고정하고 싶다면:
- 해제:
std::cout.unsetf(std::ios::fixed); - 또는 매니퓰레이터:
<iomanip>의std::setprecision(n)과 조합해 스코프별로 설정을 바꿀 수 있다.
다른 스트림(std::cerr, 파일 스트림 등)은 각각 별도 설정이므로, cout에만 적용된 상태는 다른 스트림에는 영향을 주지 않는다.
요약
| 목적 | 사용 방법 |
|---|---|
| 전체 유효 자릿수 n개 | std::cout.precision(n); 만 사용 |
| 소수점 이하 n자리 고정 | std::cout << std::fixed; 후 std::cout.precision(n); |
| 고정 소수점 해제 | std::cout.unsetf(std::ios::fixed); |
cin/cout 환경에서 실수 출력을 제어할 때는 “전체 자릿수”와 “소수점 이하 자릿수”를 구분하고, fixed 적용 여부에 따라 precision의 의미가 달라진다는 점만 기억하면 된다.
참고 문헌
- std::ios_base::precision - cppreference.com — precision 설정·반환 의미와 기본값.
- std::fixed, std::scientific - cppreference.com — 고정/과학적 표기 매니퓰레이터.
- std::setprecision - cppreference.com — precision을 매니퓰레이터로 설정하는 방법.
![Featured image of post [C++] cout 소수점 자릿수·정밀도 제어 (precision, fixed)](/post/2022-03-29-cpp-cout-precision/wordcloud_hu_1110c9244b6bfa08.webp)
![[Hardware] LattePanda Alpha에 Ubuntu 16.04 LTS 설치 가이드](/post/2018-12-06-install-ubuntu-16.04-on-lattepanda/wordcloud_hu_fc536f8de2cbd4bf.webp)
![[Rust] Comprehensive Rust 무료 강의 정리 및 코스 구조](/post/2022-12-30-comprehensive-rust/wordcloud_hu_d1420ff38434cdb6.webp)
![[.NET] 런타임별 Finalizer 호출 차이와 IDisposable 권장](/post/2021-04-27-distructor-called-by-runtime/wordcloud_hu_7b7dd809a5d4bdc3.webp)
![[RPM] Spec 파일에서 주석과 매크로 동시 사용 시 주의사항](/post/2021-11-24-rpm-spec-comments/wordcloud_hu_6d09ac09623081c7.webp)
![[Tutorial] Learn Prompting - 프롬프트 엔지니어링 무료 가이드 정리](/post/2022-12-30-learn-prompting/wordcloud_hu_6a9d105de4834753.webp)