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

如何拆分商品数量使单价保留两位小数?(附Python实现需求)

商品数量拆分问题:单价保留两位小数且总金额一致

需求:拆分商品数量,拆分后每部分的单价必须保留两位小数,且所有部分的金额总和与原总金额完全相等。

示例说明

原商品信息

initial_quantity = 2880
initial_value = 488.95  # Python中使用点作为小数分隔符

# 初始单价:
initial_unit_price = initial_value / initial_quantity  # 结果为0.1697743055555556,不符合两位小数要求

手动拆分结果示例

quantity = 2800
unit_price = 0.16
value = 448.00 (quantity * unit_price)

quantity = 79
unit_price = 0.51
value = 40.29

quantity = 1
unit_price = 0.66
value = 0.66

TOTAL 488.95

待完善的Python函数

我尝试编写了如下函数,但拆分逻辑未完成,请求帮助完善:

def split_quantity(quantity, total_value):
    quantities = []

    # 计算初始单价
    initial_unit_price = total_value / quantity  # 0.1697743055555556
    
    # 检查单价小数位是否超过两位(原代码语法错误已修正)
    if len(str(initial_unit_price).split(".")[1]) > 2:
        # 尝试调整单价(原代码未指定保留两位小数,已修正)
        unit_price = round(initial_unit_price, 2)  # 结果为0.17

        # 后续拆分逻辑待完善
    
    else:
        quantities.append({
            "quantity": quantity,
            "unit_price": round(initial_unit_price, 2),
            "value": total_value
        })
    return quantities

# 原调用语法错误已修正:逗号改为点,参数传递格式修正
result = split_quantity(2880, 488.95)
result2 = split_quantity(3, 537.46)

完善后的函数实现

以下是满足需求的完整函数,核心思路是先按四舍五入后的单价处理大部分数量,最后通过调整剩余数量的单价补平总金额差额,同时规避浮点数精度问题:

def split_quantity(quantity, total_value):
    quantities = []
    # 转换为以分为单位的整数,避免浮点数精度误差
    total_cents = int(round(total_value * 100))
    initial_unit_price_cents = total_cents / quantity

    # 初始单价本身符合两位小数要求,直接返回单一条目
    if initial_unit_price_cents.is_integer():
        unit_price = initial_unit_price_cents / 100
        quantities.append({
            "quantity": quantity,
            "unit_price": round(unit_price, 2),
            "value": round(quantity * unit_price, 2)
        })
        return quantities
    
    # 开始拆分逻辑
    rounded_unit_price_cents = round(initial_unit_price_cents)
    rounded_unit_price = rounded_unit_price_cents / 100

    # 先处理quantity-1个商品,计算剩余金额
    remainder_quantity = 1
    n = quantity - remainder_quantity
    n_value_cents = n * rounded_unit_price_cents
    remainder_value_cents = total_cents - n_value_cents

    # 添加第一部分
    quantities.append({
        "quantity": n,
        "unit_price": round(rounded_unit_price, 2),
        "value": round(n * rounded_unit_price, 2)
    })

    # 若剩余数量仍大于1,重复拆分直到剩余1个
    current_quantity = remainder_quantity
    current_total_cents = remainder_value_cents
    while current_quantity > 1:
        current_unit_price_cents = current_total_cents / current_quantity
        if current_unit_price_cents.is_integer():
            unit_price = current_unit_price_cents / 100
            quantities.append({
                "quantity": current_quantity,
                "unit_price": round(unit_price, 2),
                "value": round(current_quantity * unit_price, 2)
            })
            break
        
        rounded_current_unit_price_cents = round(current_unit_price_cents)
        rounded_current_unit_price = rounded_current_unit_price_cents / 100
        next_n = current_quantity - 1
        next_value_cents = next_n * rounded_current_unit_price_cents
        next_remainder_cents = current_total_cents - next_value_cents

        quantities.append({
            "quantity": next_n,
            "unit_price": round(rounded_current_unit_price, 2),
            "value": round(next_n * rounded_current_unit_price, 2)
        })

        current_quantity = 1
        current_total_cents = next_remainder_cents

    # 添加最后补平差额的部分
    quantities.append({
        "quantity": current_quantity,
        "unit_price": round(current_total_cents / 100, 2),
        "value": round(current_total_cents / 100, 2)
    })

    return quantities

# 测试示例
print("拆分结果1:")
result = split_quantity(2880, 488.95)
for item in result:
    print(f"数量: {item['quantity']}, 单价: {item['unit_price']:.2f}, 金额: {item['value']:.2f}")
print(f"总金额: {sum(item['value'] for item in result):.2f}\n")

print("拆分结果2:")
result2 = split_quantity(3, 537.46)
for item in result2:
    print(f"数量: {item['quantity']}, 单价: {item['unit_price']:.2f}, 金额: {item['value']:.2f}")
print(f"总金额: {sum(item['value'] for item in result2):.2f}")

逻辑说明

  1. 精度处理:将金额转换为以分为单位的整数,彻底避免浮点数运算的精度丢失问题。
  2. 直接返回场景:如果初始单价本身就是两位小数的整数倍,无需拆分,直接返回单一条目。
  3. 拆分逻辑:
    • 优先按四舍五入后的单价处理quantity-1个商品,计算剩余金额。
    • 若剩余数量仍大于1,重复上述拆分步骤,直到剩余数量为1,最后一个商品的单价直接用剩余金额计算,确保总金额与原金额完全一致。
  4. 结果验证:所有拆分后的金额总和严格等于原总金额,且每个单价都保留两位小数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:45:18