目录
- 问题
- 解决方案
- int 函数
- round 函数
- math.floor() 函数
- math.ceil() 函数
- 讨论
- (1)参数 ndigits 可以为负数
- (2)不要与格式化混为一谈
- (3)精度上有需求请选择 decimal
在 Python 中对整数和浮点数进行数学计算是非常容易的。但是如果需要对分数、数组或者日期和时间进行计算,就需要完成更多的工作。
所以从本节内容起,将开始围绕数字、日期与时间进行学习记录。
问题
如果我们想要将一个浮点数取整到固定的小数点,怎么做?
解决方案
int 函数
int()
:将数字转换为整数,去掉小数部分,不进行四舍五入。
int(1.5) # 输出: 1
int(2.5) # 输出: 2
round 函数
四舍五入到最接近的整数,使用“四舍六入五考虑”,即“银行家舍入”(Banker’s Rounding)规则。
“所谓银行家规则,即:对于小数点后第一位为5的情况,通常的规则是看5前面的数字是奇数还是偶数:如果是奇数,则向上舍入;如果是偶数,则向下舍入。”
round(1.5) # 输出: 2
round(2.5) # 输出: 2
round(value, ndigits)
函数支持两个参数的输入,ndigits
指定舍入到的小数位数。
round(1.25, 1) # 输出: 1.2
round(1.35, 1) # 输出: 1.4
math.floor() 函数
math.floor()
函数意为向下取整,即返回小于或等于给定数字的最小整数。
import mathmath.floor(1.4) # 输出: 1
math.floor(2.7) # 输出: 2
math.ceil() 函数
math.ceil()
函数意为向上取整,即返回大于或等于给定数字的最小整数。
import mathmath.ceil(1.4) # 输出: 2
math.ceil(2.7) # 输出: 3
讨论
(1)参数 ndigits 可以为负数
本节内容主要针对 round()
函数做拓展。传递给 round(value, ndigits)
函数的两个参数都可为负数。当参数 ndigits
取为负数时,会对应的取整到十位、百位、千位等。
print(round(231452, -2))>>> 231500
(2)不要与格式化混为一谈
需要注意到的是,在对值进行输出时,不要把取整和格式化操作混为一谈,如果只是将数值以固定的位数输出,一般来说用不到 round()
函数。相反,只要在格式化时指定所需要的精度即可。
x = 1.23456
print(format(x, "0.2f"))
print("value is {:0.3f}".format(x))
结果为:
1.23
value is 1.235
(3)精度上有需求请选择 decimal
不要采用对浮点数取整的方式来“修正”精度上的问题。比如下述操作
a = 2.1
b = 4.2
c = a + b
print(c) # 结果为: 6.300000000000001
c = round(c, 2)
print(c) # 结果为: 6.3
对于绝大部分场景的浮点数操作,一般不会苛求小误差,是可容忍的。但是如果在一些如金融类的场景中,对出现误差的行为非常看重,那么请选择 decimal
模块,在下一节中将详细介绍。