{ }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);}