Python怎么直接截断小数部分取整数

木白
木白
发布时间:2026-10-27| 5人浏览过
原创

详细讲解在Python中如何直接截断浮点数的小数部分取整,对比int()、math.trunc()、math.floor()与整除运算符的不同行为,深入解析正负数场景下的原理与常见陷阱。

在 Python 中直接截断浮点数的小数部分并保留整数,最直接且推荐的方法是使用内置函数 int(),或者导入 math 模块使用 math.trunc()。这两种方式的核心特征是向零截断(Truncate towards zero):无论正数还是负数,都只将小数点后的所有数字直接抹去,保留整数位,完全不执行四舍五入。

Python怎么直接截断小数部分取整数
图 1:向零截断与向下取整在数轴上的行为差异示意图

方法一:最常用的内置函数 int()

在日常开发中,直接使用 Python 的内置类型构造器 int() 是实现小数截断最快、最简洁的方式。它不需要导入任何第三方库或标准库模块,开箱即用。

# 示例 1:使用 int() 截断正浮点数
positive_num = 3.999
result_pos = int(positive_num)
print("截断前:", positive_num, "截断后:", result_pos)
# 示例输出: 截断前: 3.999 截断后: 3

# 示例 2:使用 int() 截断负浮点数
negative_num = -3.999
result_neg = int(negative_num)
print("截断前:", negative_num, "截断后:", result_neg)
# 示例输出: 截断前: -3.999 截断后: -3

从输出中可以看到,无论是 3.999 还是 -3.999,int() 都没有进行向上进位或向负数方向偏移,而是像裁纸一样把小数点后所有的数字统统切掉,仅保留符号和整数位。

方法二:语义明确的标准库函数 math.trunc()

如果你编写的代码属于数学计算库、数据分析管道,或者团队代码规范要求“函数名称必须能够自解释其意图”,那么标准库中的 math.trunc() 是更理想的选择。trunc 即英文单词 truncate(截断)的缩写。

import math

# 示例:使用 math.trunc() 截断小数
num1 = 8.12
num2 = 8.99
num3 = -8.75

print(math.trunc(num1))  # 示例输出: 8
print(math.trunc(num2))  # 示例输出: 8
print(math.trunc(num3))  # 示例输出: -8

在底层机制上,int(x) 与 math.trunc(x) 在处理标准浮点数时逻辑完全等价。math.trunc() 会优先调用对象的 __trunc__() 魔术方法;而在 Python 内部,int(x) 在转换非整型对象时,也会委托给该对象的 __trunc__() 方法。两者在性能上的微小差异通常可以忽略,选择哪一个主要取决于代码的可读性偏好。

Python怎么直接截断小数部分取整数
图 2:Python 截断小数取整的操作步骤与场景对应关系

容易混淆的两种取整误区

在初学或快速编写代码时,有两处极易被混淆的写法:一个是整除运算符 //,另一个是字符串分割。

误区一:使用双斜杠整除运算符 // 代替截断

很多开发者习惯用 a // b 来做除法并取整。对于正数运算,7 // 2 的结果确实是 3,与 int(7 / 2) 表现完全相同。但 Python 中的 // 实际上是向下取整除法(Floor Division),而不是截断除法。

一旦参与运算的数值为负数,两者的差异就会显现:

# 正数情况:两者表面一致
print(7 // 2)        # 示例输出: 3
print(int(7 / 2))    # 示例输出: 3

# 负数情况:发生严重分歧
print(-7 // 2)       # 示例输出: -4 (向负无穷方向取整)
print(int(-7 / 2))   # 示例输出: -3 (直接截断小数部分)

如果业务需求是“把小数部分直接丢弃”,在处理除法运算时,必须写成 int(a / b) 或 math.trunc(a / b),不能直接用 a // b。

Python怎么直接截断小数部分取整数
图 3:正负数场景下截断除法与双斜杠向下整除的结果对照

误区二:将浮点数转为字符串后通过 split('.') 截断

有些开发者因为担心数值类型在某些边界上有浮点精度漂移,会尝试用字符串切割来取整:

# 不推荐的做法:字符串切分
val = 12.34
truncated = int(str(val).split('.')[0])

这种做法存在三个明确的问题:

  1. 性能开销大:浮点数转字符串、堆内存分配、字符串查找分割、再解析回整型,运算开销比原生的 int() 大数十倍。
  2. 科学计数法崩溃:如果输入的数字非常小或非常大(例如 1e-05 或 2.5e+12),str(val) 会输出带有字母 e 的形式,此时通过点号切分会直接导致逻辑错误。
  3. 负号处理繁琐:如果输入包含格式化字符或前置符号,字符串处理极易引发意外异常。

针对 Decimal 高精度类型的截断

如果你在处理财务记账、货币金额或科学实验数据,使用的是标准库 decimal.Decimal 类型,同样可以使用 int() 快速获取截断整数:

from decimal import Decimal, ROUND_DOWN

amount = Decimal('-128.95')

# 方式 1:直接转为 int(向零截断)
print(int(amount))  # 示例输出: -128

# 方式 2:使用 quantize 配合 ROUND_DOWN 保持 Decimal 类型
truncated_decimal = amount.quantize(Decimal('1'), rounding=ROUND_DOWN)
print(truncated_decimal)  # 示例输出: -128

需要注意,Decimal 中的 ROUND_DOWN 对应的是“向零方向舍入”(即截断),而 ROUND_FLOOR 对应的是“向负无穷舍入”。这再次印证了截断在数值计算中的本质是 ROUND_DOWN。

常见取整函数综合对比与总结

为了让不同场景下的函数选择更加清晰,下表将 Python 中常见的取整手段进行了横向对比:

Python怎么直接截断小数部分取整数
图 4:Python 各取整方法机制及输入输出速查对照表

总结:要直接截断小数部分取整数,日常直接使用 int(x) 即可;若希望明确表达数学截断语义,可以使用 math.trunc(x)。只要记住截断是“向零靠拢”,就能在涉及负数和除法计算时避免混淆 math.floor 与 // 运算符。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。