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