Python3 floor() 函数(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Python 编程中,处理数值计算时常常会遇到浮点数的取整问题。例如,计算商品总价时需要向下取整,或者在算法设计中需要截断小数部分。此时,Python3 floor() 函数便成为了一个不可或缺的工具。本文将从基础概念到实际应用,深入解析这一函数的功能、使用场景及常见误区,帮助开发者高效掌握这一数学工具。


一、什么是 floor() 函数?

1.1 基本定义与数学背景

floor() 函数是 Python 标准库 math 中的一个数学函数,其核心功能是将输入的浮点数向下取整,返回小于或等于该数的最大整数。例如:

import math
print(math.floor(3.7))  # 输出 3  
print(math.floor(-2.3))  # 输出 -3  

这一操作类似于数学中的「地板函数」(Floor Function),形象地理解为:将数值向下「踩」到最近的整数位置。

1.2 与整数转换的区别

不同于直接将浮点数转换为整数(如 int(3.7)),floor() 函数在负数场景下表现不同:

print(int(3.7))   # 输出 3  
print(int(-2.3))  # 输出 -2  
print(math.floor(-2.3))  # 输出 -3  

这体现了 floor() 函数严格的数学定义,而 int() 仅截断小数部分,可能不符合某些业务逻辑需求。


二、函数语法与基本用法

2.1 函数语法

math.floor(x)  
  • 参数 x:需为浮点数或可转换为浮点数的数值类型(如整数)。
  • 返回值:与输入数值类型相同的整数(例如输入 float 返回 float,输入 int 返回 int)。

2.2 常见场景示例

示例 1:正数向下取整

import math  
price = 99.99  
discounted_price = math.floor(price * 0.8)  # 计算 8 折后价格  
print(discounted_price)  # 输出 79  

这里通过 floor() 确保折扣后价格不保留小数部分,符合某些商家「向下取整促销」的规则。

示例 2:负数场景

temperature = -5.8  
rounded_temp = math.floor(temperature)  
print(rounded_temp)  # 输出 -6  

此时,-5.8 的「地板」是更小的整数 -6,而非简单的截断结果 -5。


三、函数实现原理与注意事项

3.1 浮点数精度问题

由于计算机二进制表示的局限性,某些十进制小数无法精确存储为浮点数。例如:

print(math.floor(1.234567890123456789))  # 输出 1  

但需注意极端情况:

print(math.floor(2.6000000000000001))  # 输出 2(可能因精度丢失被识别为 2.6)  

此时可结合 decimal 模块处理高精度计算需求。

3.2 参数类型限制

floor() 仅支持数值类型。若输入字符串或非数值,会引发 TypeError

math.floor("3.7")  # 报错:TypeError: must be real number, not str  

解决方案:

math.floor(float("3.7"))  # 显式转换为浮点数  

四、与类似函数的对比

4.1 math.floor() vs math.ceil()

ceil() 函数与 floor() 相反,执行向上取整操作:
| 数值 | floor() 结果 | ceil() 结果 |
|-----------|----------------|---------------|
| 2.3 | 2 | 3 |
| -3.7 | -4 | -3 |

4.2 math.floor() vs round()

round() 函数按四舍五入规则处理,但 floor() 严格向下取整:

print(round(2.5))    # 输出 2(四舍五入)  
print(math.floor(2.5))  # 输出 2  
print(round(3.5))    # 输出 4  
print(math.floor(3.5))  # 输出 3  

4.3 math.floor() vs int()

如前所述,int() 截断小数部分,而 floor() 遵循数学定义:

print(math.floor(-2.3) == int(-2.3))  # False  

五、实际应用场景与案例

5.1 商品价格计算

假设某电商平台对订单金额进行阶梯式优惠:

def calculate_price(total):  
    if total >= 500:  
        discounted = math.floor(total * 0.9)  
    else:  
        discounted = math.floor(total * 0.95)  
    return discounted  

print(calculate_price(499.99))  # 输出 474(原价 499.99 × 0.95 ≈ 474.991 → 取整为 474)  

5.2 分页逻辑优化

在 Web 开发中,分页功能常需计算总页数:

def get_total_pages(total_items, per_page):  
    return math.floor((total_items - 1) / per_page) + 1  

print(get_total_pages(25, 10))  # 输出 3(25 个项目分每页 10 个,需 3 页)  

5.3 游戏开发中的坐标截断

在游戏场景中,确保角色坐标为整数:

import math  

def move_character(x, y, step):  
    new_x = x + step  
    new_y = y - step * 0.5  
    return (math.floor(new_x), math.floor(new_y))  

print(move_character(1.8, 3.2, 2))  # 输出 (3, 1)  

六、进阶技巧与常见误区

6.1 处理浮点数溢出

当数值超出 float 的表示范围时,floor() 可能返回 infnan

import math  
print(math.floor(1e500))  # 输出 inf  

建议对数据范围进行预校验。

6.2 负数与零的特殊处理

  • math.floor(0.0) 返回 0.0
  • math.floor(-0.0) 返回 -0.0(在 Python 中,-0.0 与 0.0 相等,但符号位不同)

6.3 组合函数使用

结合 math 其他函数实现复杂逻辑:

import math  

def normalize_angle(angle_degrees):  
    # 将角度归一化到 [0°, 360°) 范围  
    return angle_degrees - 360 * math.floor(angle_degrees / 360)  

print(normalize_angle(720.5))  # 输出 0.5  
print(normalize_angle(-90))    # 输出 270  

七、总结与实践建议

7.1 核心知识点回顾

  • 功能:向下取整至最近整数
  • 参数:需为数值类型
  • 负数行为:严格遵循数学定义
  • 对比函数ceil()round()int()

7.2 推荐学习路径

  1. 练习 floor() 在基础数学问题中的应用(如分数取整、坐标计算)
  2. 结合实际项目场景(如电商、数据分析)深化理解
  3. 探索 decimal 模块处理高精度需求

7.3 最后提醒

在使用 floor() 时,务必考虑数值的正负性和业务逻辑需求。例如,财务计算中需严格遵循「向下取整」规则,而游戏开发可能需要结合其他数学函数实现平滑过渡。

通过本文的系统解析,开发者可以全面掌握 Python3 floor() 函数 的理论与实践,将其灵活应用于各类编程场景中。

最新发布