Python round() 函数

Python round() 语法

round() 是 Python 的一个内置函数,它用于将某个数四舍五入到指定的小数位数。

语法:

round(x, n)

说明:

round() 函数接收以下 2 个参数。

  • x(必选) :是一个数字。
  • n(可选,默认值:0) :是一个整数,表示要保留 n 位小数。
    • 如果 n 省略或为 None,则返回最接近的整数(返回类型为 int)。
    • 如果 n 是负数,则表示舍入到十位、百位(比如 n = -2 表示舍入到百位)。
    • 如果 n 是正数,表示保留 n 位小数(返回类型为 float)。

注意:

  • round() 并不属于 math 模块,而是 Python 的内置函数。因此,我们不需要导入 math 模块就可以直接使用它。
  • round() 对浮点数的运算可能存在精度问题,因此在高精度场景中,建议使用 decimal 模块。

Python round() 摘要

属于 Python 内置函数
使用频率
官方文档 查看
相关函数 abs()pow()divmod()

Python round() 示例

接下来,我们通过几个简单的例子来讲解一下 Python round() 函数是如何使用的。

示例 1:round() 带 1 个参数(省略 n 参数)

x = 3.1415
y = 6.6666
print(round(x))
print(round(y))

运行结果如下。

3
7

分析:

round(x) 表示只保留整数部分,此时会对第 1 位小数四舍五入。

示例 2:round() 带 2 个参数(n 为正整数)

x = 3.1415
y = 6.6666
print(round(x, 2))
print(round(y, 2))

运行结果如下。

3.14
6.67

分析:

round(x, 2) 表示只保留 2 位小数,此时会对第 3 位小数四舍五入。

示例 3:round() 带 2 个参数(n 为负整数)

num = 12345
print(round(num, -1))
print(round(num, -3))

运行结果如下。

12340
12000

分析:

round(num, -1) 表示舍入到十位,而 round(num, -3) 表示舍入到千位。

示例 4:round() 带 2 个参数(n = 0)

x = 3.1455
y = 6.6666
print(round(x, 0))    # 输出 : 3.0(float 类型)
print(round(y, 0))    # 输出 : 7.0(float 类型)

运行结果如下。

3.0
7.0

分析:

需要注意的是,round(x) 返回 3(int),而 round(x, 0) 返回 3.0(float)。

示例 5:round() 参数是非数字

x = '3.1415'
print(round(x, 2))

运行结果如下。

(报错)TypeError: type str doesn't define __round__ method

分析:

如果 round() 的参数是一个非数字时,此时会直接报错(抛出 TypeError 异常)。

round() 注意事项

在使用 round() 的过程中,小伙伴们尤其需要注意以下 3 点。

  • 对于 round(x, n) 来说,当 n 不存在时,round() 返回的是 “整数”。但当 n 存在(即使 n 为 0),round() 返回的也是一个 “浮点数”。
  • round() 函数对浮点数进行操作,会受到计算机精度影响。为了避免影响,可以使用 decimal 类型代替。
  • round() 函数的四舍五入方式遵循 IEEE 标准。如果有两个可能的结果,那么它会将结果四舍五入到最接近的偶数,这也被称为 “银行家舍入规则”。

示例 6:round() 采用 “银行家舍入规则”

print(round(2.5))      # 输出 : 2(舍入到最近的偶数)
print(round(3.5))      # 输出 : 4
print(round(4.5))      # 输出 : 4
print(round(-2.5))     # 输出 : -2(负数同理)

运行结果如下。

2
4
4
-2

分析:

round() 函数的四舍五入方式遵循 IEEE 标准。如果有两个可能的结果,它会将结果四舍五入到最接近的偶数,这也被称为 “银行家舍入规则”。

在这个例子中,round(2.5) 返回 2,而 round(3.5) 返回 4,因为这两个值四舍五入到了最接近的偶数。

示例 7:round() 返回值与预期不符

x = 3.665
y = 3.675
print(round(x, 2))
print(round(y, 2))

运行结果如下。

3.67
3.67

分析:

按正常逻辑来说,round(3.675, 2) 返回的应该是 3.68,但这里却是 3.67,这明显跟预期结果不符。原因就在于,数字的运算要转换为二进制数再运算。对于一个浮点数来说,它转换为二进制数时,小数部分会替换成二进制的近似值,也就是:

3.67499999999999982236431605997495353221893310546875

因此 round(3.675, 2) 返回的就是 3.67。如果你不希望出现上面的问题,此时可以考虑专门为浮点运算的 decimal 模块。

示例 8:使用 decimal 模块

from decimal import Decimal

x = Decimal('3.665')
y = Decimal('3.675')

print(round(x, 2))
print(round(y, 2))

运行结果如下。

3.66
3.68

分析:

细心的小伙伴会发现,Decimal('3.665') 保留两位小数后变成了 3.66,而 Decimal('3.675') 变成了 3.68。这是为什么呢?

实际上,decimal 模块在精确存储了十进制数后,其默认的舍入规则依然是 “银行家舍入法(凑偶规则)”。

  • 3.665 距离 3.66 和 3.67 一样近,由于 6 是偶数,所以凑偶得到 3.66。
  • 3.675 距离 3.67 和 3.68 一样近,由于 8 是偶数,所以凑偶得到 3.68。

而使用 decimal 模块,不仅解决了底层浮点数(如 3.674999...)的精度丢失问题,还能确保银行家舍入法被完美且符合直觉地执行。

上一篇: abs()

下一篇: pow()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号