{ }codelper
반올림P0048

짝수 쪽 반올림

첫 줄에 수의 개수 n, 다음 n줄에 소수점 아래가 정확히 한 자리인 수가 하나씩 주어진다.
각 수를 가장 가까운 정수로 반올림하여 한 줄에 하나씩 출력하라.
소수 부분이 딱 0.5여서 두 정수의 한가운데이면 짝수인 쪽으로 보낸다(은행원 반올림): 0.5 → 0, 1.5 → 2, 2.5 → 2, -0.5 → 0, -1.5 → -2, -2.5 → -2.
한가운데가 아니면 가까운 쪽이다(2.4 → 2, -2.6 → -3).
결과가 0이면 "-0"이 아니라 "0"을 출력한다.

입력
1 ≤ n ≤ 1,000, -1,000,000.0 ≤ 수 ≤ 1,000,000.0, 모든 수는 소수점 아래 한 자리로 쓰여 있다(예: 7.0, -0.4).
"-0.0"은 나오지 않는다.
출력
n줄, 각 줄에 정수 하나
예시 1 · stdin
6
2.5
3.5
-2.5
-0.4
1.6
7.0
stdout
2
4
-2
0
2
7
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

반올림 함수의 '딱 반' 규칙이 언어마다 달라요.
짝수 쪽이 기본인 곳: Python round(x), C# Math.Round(x)(기본 MidpointRounding.ToEven), Java Math.rint(x), C·C++ rint·llrint·nearbyint(기본 반올림 방식).
0에서 먼 쪽: C·C++ round·llround, 크레이콘 수학.반올림.
+∞ 쪽: Java Math.round(= floor(x + 0.5), 2.5 → 3), JS·TS Math.round(2.5 → 3, -2.5 → -2).
JS·TS와 크레이콘에는 짝수 쪽 반올림이 없어서 floor로 내린 뒤 남은 부분이 0.5인지 보고 직접 만들어요 — 소수 한 자리 수에서 0.5는 이진수로도 정확해서 x - floor(x) == 0.5 비교가 믿을 만해요.
두 번째 함정은 -0이에요.
-0.4를 반올림하면 실수 -0이 되는데, JS console.log(-0), C printf("%.0f"), C#의 Console.WriteLine(Math.Round(-0.4))(.NET Core 3.0부터)는 "-0"을 찍어요.
C#·Java·C는 정수(long)로 바꿔 찍고, JS·TS·크레이콘은 + 0을 더하면 -0이 0이 돼요.
Python round(x)는 처음부터 int를 돌려줘서 괜찮아요.

Pythonmain.py · 4 줄
n = int(input())for _ in range(n):    # round()는 딱 반이면 짝수 쪽으로 간다(2.5 → 2, 3.5 → 4). 돌려주는 값도 int라 -0이 없다    print(round(float(input())))
JavaScriptmain.js · 13 줄
const [n, ...xs] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number); // JS에는 짝수 쪽 반올림이 없다. Math.round는 딱 반이면 +∞ 쪽(2.5 → 3, -2.5 → -2)function roundHalfEven(x) {  const f = Math.floor(x);  const diff = x - f; // 소수 한 자리라 0.5는 정확히 0.5로 나온다  if (diff < 0.5) return f;  if (diff > 0.5) return f + 1;  return f % 2 === 0 ? f : f + 1;} // f + 0으로 -0을 0으로 (console.log(-0)은 "-0"을 찍는다)console.log(xs.map((x) => roundHalfEven(x) + 0).join("\n"));
TypeScriptmain.ts · 14 줄
import { readFileSync } from "node:fs";const [n, ...xs]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number); // TS에도 짝수 쪽 반올림이 없다. Math.round는 딱 반이면 +∞ 쪽(2.5 → 3, -2.5 → -2)function roundHalfEven(x: number): number {  const f = Math.floor(x);  const diff = x - f; // 소수 한 자리라 0.5는 정확히 0.5로 나온다  if (diff < 0.5) return f;  if (diff > 0.5) return f + 1;  return f % 2 === 0 ? f : f + 1;} // + 0으로 -0을 0으로 (console.log(-0)은 "-0"을 찍는다)console.log(xs.map((x) => roundHalfEven(x) + 0).join("\n"));
JavaMain.java · 17 줄
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            double x = Double.parseDouble(br.readLine().trim());            // Math.rint는 딱 반이면 짝수 쪽. Math.round는 floor(x + 0.5)라 2.5 → 3            // long으로 바꾸면 -0.0도 0이 된다            out.append((long) Math.rint(x)).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 17 줄
using System;using System.Globalization; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        for (int i = 0; i < n; i++)        {            double x = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);            // Math.Round의 기본은 짝수 쪽(MidpointRounding.ToEven).            // 돌려주는 값이 double이라 -0.4 → -0이 "-0"으로 찍히니 long으로 바꾼다            Console.WriteLine((long)Math.Round(x));        }    }}
C++main.cpp · 15 줄
#include <cmath>#include <iostream> int main() {    std::ios::sync_with_stdio(false);    std::cin.tie(nullptr);    int n;    double x;    std::cin >> n;    for (int i = 0; i < n; i++) {        std::cin >> x;        // std::llrint는 기본 반올림 방식(딱 반이면 짝수 쪽). std::round는 0에서 먼 쪽        std::cout << std::llrint(x) << '\n';    }}
Cmain.c · 15 줄
#include <math.h>#include <stdio.h> int main(void) {    int n;    double x;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        scanf("%lf", &x);        /* llrint는 지금 반올림 방식(기본: 딱 반이면 짝수 쪽)을 따른다.           round()는 0에서 먼 쪽이라 2.5 → 3 */        printf("%lld\n", llrint(x));    }    return 0;}
Craykonmain.cray · 21 줄
// 수학.반올림은 딱 반이면 0에서 먼 쪽(2.5 → 3)이라 짝수 쪽 반올림은 직접 만든다짝수쪽반올림(x){    f = 수학.내림(x);    차 = x - f;    만약 (차 < 0.5)    {        돌려주기 f;    }    만약 (차 > 0.5)    {        돌려주기 f + 1;    }    돌려주기 f % 2 == 0 ? f : f + 1;} n = 콘솔.줄읽기().수로변환();반복 (i = 0; i < n; i++){    콘솔.쓰기(짝수쪽반올림(콘솔.줄읽기().수로변환()) + 0);}