Python 关于浮点数取整详解
文章目录
- Python 关于浮点数取整详解
- 一、四舍五入
- 二、向下取整
- 三、向上取整
- 四、截取整数和小数部分
- 五、扩展:浮点数精度问题
- 相关博客😏
一、四舍五入
将浮点数以四舍五入的方式进行取整,也可以四舍五入到小数点后几位
print(int(round(5.625, 0))) # 保留小数点后0位,进行取整
print(round(5.625, 1)) # 保留小数点后1位
print(round(2.325, 2)) # 保留小数点后2位
6
5.6
2.33
内置函数 round(x, n) 方法返回浮点数x的四舍五入值
二、向下取整
1)、将浮点数转换为整数
这是最直接的方法,将浮点数类型转化为整数类型,只会保留整数部分,即向下取整结果
print(int(2.333333)) # 结果为 2
print(int(2.999999)) # 结果为 2
print(int(6.666666)) # 结果为 6
2)、使用 math 模块下的 floor(x) 方法
math.floor(x)
x 为浮点数时则 向下取整,为整数时直接返回,不做任何更改
num1 = 5.668
num2 = 4
print(math.floor(num1)) # 结果为 5
print(math.floor(num2)) # 结果为 4
3)、使用 math 模块下的 trunc(x) 方法
math.trunc(x)
截取 x 的整数部分并返回
此方法和上面提到的 int() 方法一样,都是直接获取整数部分,用 int() 即可,此方法了解即可
print(math.trunc(2.333333)) # 结果为 2
print(math.trunc(6.666666)) # 结果为 6
print(int(2.333333)) # 结果为 2
三、向上取整
使用 math 模块下的 ceil(x) 方法
math.ceil(x)
x 为浮点数时则 向上取整,为整数时直接返回,不做任何更改
num1 = 5.668
num2 = 5
print(math.ceil(num1)) # 结果为 6
print(math.ceil(num2)) # 结果为 5
四、截取整数和小数部分
1)、使用 math 模块下的 modf(x) 方法
math.modf(x)
返回 x 的 小数、整数 部分的数组,相当于对小数点前后进行了拆分,返回的值都 带有 x的符号,且都是浮点数类型
print(math.modf(2.25))
x = math.modf(5.6)
print(x) # 小数部分存在精确不足的问题
print(round(x[0], 1), x[-1]) # 可以使用round() 解决
(0.25, 2.0)
(0.5999999999999996, 5.0)
0.6 5.0
2)、利用字符串 split() 方法
先将数值转化为字符串类型,根据字符串 split() 方法 以小数点为依据进行分割,再将 整数部分 和 小数部分分别进行处理即可
x = 2.33333
x = str(x).split(".")
x[0], x[-1] = int(x[0]), float("0." + x[-1]) # 小数部分得加上 0.
print(x)
[2, 0.33333]
五、扩展:浮点数精度问题
Python中使用的是双精度浮点数来存储浮点数,相当于二进制浮点数运算,采用 IEEE 754 规范来存储浮点数,无法精确表示小数
print(0.1 + 0.2)
print(2.3 + 0.033)
0.30000000000000004
2.3329999999999997
1)、利用round(x, n) 方法
利用上面已经提到过的 round(x, n)方法
print(round(0.1 + 0.2, 1))
print(round(2.3 + 0.033, 3))
0.3
2.333
2)、利用decimal模块
decimal 模块为快速正确舍入的十进制浮点运算提供支持,可以有效的避免精度问题
from decimal import Decimal
from decimal import getcontext
print(Decimal("0.1") + Decimal("0.2")) # 数值以字符串形式传入
print(Decimal("2.3") + Decimal("0.033"))
print(Decimal("7") / Decimal("3"))
getcontext().prec = 4 # 设置小数点后的精确值
print(Decimal("7") / Decimal("3"))
0.3
2.333
2.333333333333333333333333333
2.333