개념

실수 자료형과 계산

항목C++JavaPython
실수 자료형doubledoublefloat
정수에서 실수로 변환double(a)(double) afloat(a)
두 정수로 실수 계산double(a) / b(double) a / ba / b

C++과 Java에서는 연산 전에 한 값을 실수형으로 바꾸어야 소수 부분까지 계산합니다. 예를 들어 5 / 2의 결과는 정수 22이고, 5.0 / 2의 결과는 실수 2.52.5입니다. Python의 /는 정수끼리 계산해도 실수 결과를 반환합니다.

소수점 아래 N자리까지 출력

자릿수를 지정하면 출력할 문자열을 해당 자리까지 반올림하고, 부족한 자리는 00으로 채웁니다. x=3.14159x=3.14159를 소수점 아래 세 자리로 출력하면 3.142, x=2.5x=2.5이면 2.500입니다.

동작C++JavaPython
소수점 아래 세 자리cout << fixed << setprecision(3) << x;System.out.printf(Locale.ROOT, "%.3f", x);print(f"{x:.3f}")
소수점 아래 n자리cout << fixed << setprecision(n) << x;System.out.printf(Locale.ROOT, "%." + n + "f", x);print(f"{x:.{n}f}")
필요한 라이브러리<iostream>, <iomanip>java.util.Locale내장 서식 사용

C++에서는 fixed와 setprecision(n)을 함께 사용해야 소수점 아래 자릿수를 지정합니다. fixed가 없으면 setprecision은 유효 숫자의 개수를 지정합니다. 설정은 이후 출력에도 적용됩니다.

Java의 Locale.ROOT는 실행 환경에 관계없이 소수 구분자를 .으로 출력하도록 지정합니다. Python의 서식에서 .3f는 소수점 아래 세 자리이며, .{n}f는 변수 n으로 그 자릿수를 정합니다.

N=0N=0이면 소수점 없이 정수 자리까지 출력합니다. 출력 형식은 변수에 저장된 값을 바꾸지 않습니다. round(x, n)처럼 값을 계산하는 함수와 자릿수를 맞춰 출력하는 서식은 구분해서 사용합니다.

올림과 내림

올림은 주어진 값 이상인 정수 중 가장 작은 값이고, 내림은 주어진 값 이하인 정수 중 가장 큰 값입니다.

값올림내림
2.32.33322
−2.3-2.3−2-2−3-3
2.02.02222

음수에서는 −3<−2.3<−2-3<-2.3<-2이므로 올림이 −2-2, 내림이 −3-3입니다. 정수형으로 변환해 소수 부분을 버리면 −2.3-2.3이 −2-2가 되므로 내림과 다릅니다.

동작C++JavaPython
올림ceil(x)Math.ceil(x)math.ceil(x)
내림floor(x)Math.floor(x)math.floor(x)
필요한 라이브러리<cmath>Math는 기본 제공import math
반환 자료형double 입력이면 doubledoubleint

C++과 Java에서 결과를 정수로 저장하려면, 결과가 정수 자료형 범위에 들어가는지 확인한 뒤 변환합니다.

반올림과 정확히 중간인 값

반올림은 가장 가까운 정수를 선택합니다. 2.32.3은 22, 2.82.8은 33이 됩니다. 2.52.5처럼 두 정수까지의 거리가 같은 값은 언어별 규칙이 다릅니다.

항목C++JavaPython
함수round(x)Math.round(x)round(x)
중간값 선택00에서 더 먼 정수더 큰 정수짝수인 정수
2.52.5333322
3.53.5444444
−2.5-2.5−3-3−2-2−2-2
−3.5-3.5−4-4−3-3−4-4
반환 자료형double 입력이면 doubledouble 입력이면 long자릿수를 생략하면 int

양수에서 소수 부분이 0.50.5 이상이면 올리는 규칙이 필요할 때는 floor(x + 0.5)로 계산할 수 있습니다. Python에서도 이 규칙을 적용하려면 math.floor(x + 0.5)를 사용합니다. 음수의 중간값은 문제에서 요구하는 방향을 확인하여 처리합니다. 언어별 함수 규칙은 Java Math 문서와 Python round 문서에서 확인할 수 있습니다.

실수의 정밀도

실수 자료형은 유한한 비트로 값을 근사하여 저장합니다. 십진수 0.10.1처럼 이진수로 정확히 저장할 수 없는 값이 있어, 계산 결과가 수학적인 값과 조금 다를 수 있습니다.

예를 들어 Python의 round(2.675, 2)는 2.67입니다. 저장된 값이 정확한 2.6752.675보다 조금 작기 때문입니다. 반올림 함수는 저장된 값을 기준으로 계산하므로, 출력 자릿수를 늘려도 계산 중의 오차가 복구되지는 않습니다.

개수나 정확한 나머지를 구하는 계산에는 정수를 사용합니다. 실수 답을 출력할 때는 문제에서 지정한 자릿수와 허용 오차를 확인합니다.

복잡도

예제의 제한된 크기 실수와 출력 자릿수 NN을 기준으로 합니다.

연산시간복잡도공간복잡도
올림·내림·정수 반올림O(1)O(1)추가 O(1)O(1)
소수점 아래 N자리 출력O(N+1)O(N+1)출력 문자열 O(N+1)O(N+1)

예제

문제

세 과목의 점수가 주어진다. 평균을 소수점 아래 NN자리까지 출력하고, 평균을 올림·내림·반올림한 정수를 각각 구하여라.

입력

첫째 줄에 세 과목의 정수 점수 A,B,CA,B,C와 출력할 자릿수 NN이 공백을 사이에 두고 주어진다. 0≤A,B,C≤1000\le A,B,C\le100; 0≤N≤60\le N\le6이다.

출력

첫째 줄에 평균을 소수점 아래 정확히 NN자리까지 출력한다. N=0N=0이면 소수점 없이 출력한다.

둘째 줄에 평균을 올림·내림·반올림한 정수를 순서대로 공백으로 구분하여 출력한다.

예제 입력

80 81 84 2

예제 출력

81.67
82 81 82

예제 코드

C++20

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    int a, b, c, n, up, down, near;
    double x;

    cin >> a >> b >> c >> n;

    // 소수 부분까지 계산하도록 실수로 평균 계산
    x = (a + b + c) / 3.0;
    up = (int)ceil(x);
    down = (int)floor(x);
    near = (int)round(x);

    // 소수점 아래 n자리를 고정하고 부족한 자리는 0으로 채움
    cout << fixed << setprecision(n) << x << '\n';
    cout << up << ' ' << down << ' ' << near << '\n';
}