杰瑞科技汇

Python round函数怎么用?

下面我将为您详细解释 round() 函数的用法、注意事项和一些高级技巧。

Python round函数怎么用?-图1
(图片来源网络,侵删)

round() 函数的基本语法

round() 函数有两种基本形式:

只提供一个参数

round(number)
  • number: 你想要进行四舍五入的数字。
  • 返回值: 返回一个四舍五入后的整数,如果输入是浮点数,返回值也是浮点数(0);如果输入是整数,返回值也是整数。

示例:

# 对正数进行四舍五入
print(round(3.3))   # 输出: 3
print(round(3.5))   # 输出: 4  (注意.5的情况,见下文“重要注意事项”)
print(round(3.7))   # 输出: 4
# 对负数进行四舍五入
print(round(-3.3))  # 输出: -3
print(round(-3.5))  # 输出: -4
print(round(-3.7))  # 输出: -4
# 对整数进行“四舍五入”,它本身不变
print(round(10))    # 输出: 10

提供两个参数(指定保留的小数位数)

round(number, ndigits)
  • number: 你想要进行四舍五入的数字。
  • ndigits: 一个整数,指定要保留的小数位数。
  • 返回值: 返回一个浮点数,保留 ndigits 位小数。

示例:

# 保留 1 位小数
print(round(3.14159, 1))  # 输出: 3.1
# 保留 2 位小数
print(round(2.71828, 2))  # 输出: 2.72
# 保留 3 位小数
print(round(123.456789, 3)) # 输出: 123.457
# ndigits 是负数,则对小数点左侧进行四舍五入
print(round(12345, -1))    # 输出: 12340 (对十位进行四舍五入)
print(round(12345, -2))    # 输出: 12000 (对百位进行四舍五入)
print(round(12345, -3))    # 输出: 10000 (对千位进行四舍五入)

重要注意事项

注意事项 1:.5 的“银行家舍入法” (Banker's Rounding)

Python 的 round() 函数对于 .5 的情况,采用的是“银行家舍入法”(也叫“四舍六入五成双”或“round half to even”)。

Python round函数怎么用?-图2
(图片来源网络,侵删)
  • 规则:当要舍弃的部分正好是 5 时,它会看保留的数字部分的最后一位是偶数还是奇数。
    • 如果是偶数,则向下舍入。
    • 如果是奇数,则向上舍入。
  • 目的:这种方法可以有效减少在大量连续运算中因传统四舍五入(逢5进1)而产生的系统性累积误差。

示例:

# 3.5,要保留的整数部分 3 是奇数,所以向上舍入到 4
print(round(3.5))   # 输出: 4
# 2.5,要保留的整数部分 2 是偶数,所以向下舍入到 2
print(round(2.5))   # 输出: 2
# 4.5,要保留的整数部分 4 是偶数,所以向下舍入到 4
print(round(4.5))   # 输出: 4
# 1.5,要保留的整数部分 1 是奇数,所以向上舍入到 2
print(round(1.5))   # 输出: 2

这个规则也适用于保留小数位数的情况:

# 保留一位小数
# 2.65,看第二位小数 5,第一位小数 6 是偶数,所以舍去 5,结果为 2.6
print(round(2.65, 1)) # 输出: 2.6
# 2.75,看第二位小数 5,第一位小数 7 是奇数,所以要进一,结果为 2.8
print(round(2.75, 1)) # 输出: 2.8

注意事项 2:浮点数精度问题

计算机使用二进制表示浮点数,有些十进制小数在二进制中是无限循环的,这会导致微小的精度误差。round() 函数可能会放大这种误差。

示例:

Python round函数怎么用?-图3
(图片来源网络,侵删)
# 理论上 2.675 应该四舍五入到 2.68
# 但由于浮点数精度问题,它可能被存储为一个比 2.675 略小的数
# 在银行家舍入法下,它会舍入到 2.67
print(round(2.675, 2))  # 输出可能是 2.67 (在某些环境下可能是 2.68)

如果你对精度要求极高(例如金融计算),应该使用 decimal 模块。


高级技巧与替代方案

需要“传统”的四舍五入(逢5进1)

如果你不希望使用银行家舍入法,而是希望 .5 总是向上舍入,可以结合 math.floor()math.ceil() 来实现。

示例:

import math
def traditional_round(number):
    """实现传统的四舍五入(逢5进1)"""
    if number >= 0:
        return math.floor(number + 0.5)
    else:
        return math.ceil(number - 0.5)
print(traditional_round(2.5))  # 输出: 3
print(traditional_round(2.4))  # 输出: 2
print(traditional_round(-2.5)) # 输出: -3

需要高精度计算(金融、货币)

对于需要精确到小数点后任意位数的场景,特别是处理金钱时,应该使用 Python 的 decimal 模块,它可以避免浮点数精度问题,并允许你自定义舍入模式。

示例:

from decimal import Decimal, ROUND_HALF_UP
# 使用 Decimal 进行精确计算
# 将字符串转换为 Decimal 以避免浮点数精度问题
number = Decimal('2.675')
# 指定使用 ROUND_HALF_UP 模式(传统的四舍五入)
rounded_number = number.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
print(rounded_number)  # 输出: 2.68 (结果准确且可预测)

函数 用法 特点 适用场景
round() round(number, ndigits) 银行家舍入法(round half to even),有浮点数精度风险。 通用科学计算、统计,不涉及金钱的日常编程。
自定义函数 math.floor(x + 0.5) 传统四舍五入(逢5进1),仍有浮点数精度风险。 需要特定舍入规则的通用场景。
decimal 模块 Decimal.quantize(...) 高精度,可自定义舍入模式(如 ROUND_HALF_UP)。 金融、货币、会计等对精度要求极高的领域。

希望这个详细的解释能帮助您完全理解 Python 的 round() 函数!

分享:
扫描分享到社交APP
上一篇
下一篇