使用Itertools Combinations无法获取长度>3的序列结果的解决方法
问题原因与解决方案
问题核心是浮点数精度误差,加上代码存在未修复的变量错误:
- 直接使用
float类型存储小数会产生精度丢失,导致求和结果无法精确匹配目标值36826.08 - 注释的
Decimal转换代码存在变量名错误(original_numbers未定义),且未启用精确计算逻辑
修改后的代码
import itertools from decimal import Decimal, getcontext # 设置Decimal计算精度,确保小数运算准确 getcontext().prec = 10 # 用字符串初始化Decimal,彻底避免float转Decimal带来的精度损失 numbers = [ Decimal("7175.90"), Decimal("14259.90"), Decimal("11625.47"), Decimal("3764.81"), Decimal("1995.27"), Decimal("542.23"), Decimal("2038.32"), Decimal("4048.83"), Decimal("490.40"), Decimal("1279.00"), Decimal("3248.90") ] target_sum = Decimal("36826.08") # 直接查找长度为4的组合(目标序列长度已知),提升计算效率 result = [seq for seq in itertools.combinations(numbers, 4) if sum(seq) == target_sum] # 按需转换回float格式输出 result_float = [tuple(float(num) for num in seq) for seq in result] print(result_float)
关键修改说明
- 精确初始化Decimal:用字符串传入数值,避免
float本身的精度偏差,确保每个数值的精确性 - 启用精确计算:替换原
float列表为Decimal列表,保证求和与目标值的对比完全精确 - 缩小查找范围:直接遍历长度为4的组合,无需从最长序列开始遍历,大幅节省计算资源
- 格式转换可选:如果需要输出原浮点数格式,可将
Decimal结果转换回float
内容的提问来源于stack exchange,提问作者storyr4
相关产品推荐
相关产品推荐

