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...)的精度丢失问题,还能确保银行家舍入法被完美且符合直觉地执行。
