{ }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()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

丸め関数の「ちょうど半分」の規則は言語ごとに違います。
既定で偶数側:Python round(x)、C# Math.Round(x)(既定 MidpointRounding.ToEven)、Java Math.rint(x)、C・C++ rint・llrint・nearbyint(既定の丸めモード)。
0 から遠い側:C・C++ round・llround、Craykon 数学.四捨五入。
+∞ 側:Java Math.round(= floor(x + 0.5)、2.5 → 3)、JS・TS Math.round(2.5 → 3、-2.5 → -2)。
JS・TS と Craykon には偶数丸めがないので、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・Craykon は + 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);}