본문 바로가기

Algorithm/PS

[PS] 소수점 제한하기(C++)

개요

일반적으로 알고리즘 문제를 풀 때 소수점 단위의 답을 요구하는 경우 특정 소수점까지 제한하는 경우가 있습니다.

 

이를 표현하기 위한 방법을 모른다면, 어렵게 구현을 해놓고 정작 답은 맞을 수가 없는데요, 오늘은 이를 위한 방법을 간단하게 알아보겠습니다.

 

아래는 이를 활용하는 문제의 예시입니다.

https://www.acmicpc.net/problem/6487

(두 직선이 정확히 한 점에서 만난다면, POINT x y의 꼴로 출력한다. 이는 두 직선이 (x,y)에서 교차함을 의미한다. x와 y는 정확히 소수점 아래 둘째 자리까지 출력한다.)

 


선결론

출력 시, std::fixed와 std::setprecision(n)을 사용하면, n자리수로 반올림해 출력하는 것이 가능해집니다.

cout << fixed << setprecision(2) << 1.234;  // 1.23
cout << fixed << setprecision(2) << 1.235;  // 1.24  (반올림)

실제로 값을 반올림해서 저장하는 것은 아니고, 출력 시 변환해서 표현하는 것입니다.


c++의 출력과 fixed

기본적으로 c++의 경우 유효숫자 6자리로 반올림해 출력합니다.

 

cout << fixed와 같이 fixed로 출력방식을 바꾼다면, 6자리가 유효숫자 6자리가 아니라 소수점 아래 6자리로 의미가 바뀝니다.

(원복하고 싶다면 defaultfloat로 설정)

 

이외의 옵션은 아래 링크에서 확인할 수 있습니다.

https://en.cppreference.com/w/cpp/io/manip/fixed.html

 

std::fixed, std::scientific, std::hexfloat, std::defaultfloat - cppreference.com

Modifies the default formatting for floating-point output. 4) Sets the floatfield of the stream str to zero, as if by calling str.unsetf(std::ios_base::floatfield). This enables the default floating-point formatting, which is different from fixed and scien

en.cppreference.com

 

그리고 setprecision을 호출하면 n자리를 제한할 수 있습니다.