如何用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
相关产品推荐
相关产品推荐

