You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pythonic方法获取浮点数除法的商与精确余数?

Pythonic方式获取浮点数除法的地板商和小数部分

想要用Pythonic的方法获取浮点数除法的地板商和除法结果的小数部分(以8.0除以3.0为例,期望得到(2.0, 0.6666666666666665)),但现有内置运算符和函数给出的是数学定义中的余数,无法满足需求。

内置除法工具的测试结果

测试代码:

import math
a = 8.0
b = 3.0
print(f'Division:{a/b}')
print(f'Floored division: {a//b}')
print(f'Modulo: {a%b}')
print(f'Remainder: {math.remainder(a,b)}')  # 基于四舍五入商计算余数
print(f'Divmod: {divmod(a, b)}')

运行结果:

Division:2.6666666666666665
Floored division: 2.0
Modulo: 2.0
Remainder: -1.0
Divmod: (2.0, 2.0)   

自定义实现与说明

用户自行实现的函数可满足需求:

def hackDivmod(a,b):  
    # 获取地板商和除法结果的小数部分
    div_result = a / b
    floored_div = a // b 
    return floored_div, div_result - floored_div 

运行结果为(2.0, 0.6666666666666665),符合预期。

是否存在更优内置方法?

Python的内置除法工具(%、divmod、math.remainder)均遵循数学余数定义:即满足a = b * q + r,其中q是商(//为地板商,math.remainder用四舍五入商),r的绝对值小于b的绝对值。这种定义下的余数是2.0而非你需要的小数部分,因此没有直接的内置函数能一步得到目标结果。

你的自定义实现已经简洁且Pythonic,也可以稍作优化以减少一次除法运算:

def float_divmod(a, b):
    floored_div = a // b
    decimal_part = (a - floored_div * b) / b
    return floored_div, decimal_part

两种写法结果一致,都能高效得到预期输出。

内容的提问来源于stack exchange,提问作者DUFF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:37:25