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

Python储蓄计算器如何实现生日圣诞节等特殊日期的金额扣减逻辑

问题诊断与修复方案

核心错误点

  • 类型不匹配:datetest 是 datetime.date 类型,你定义的 birthday、christmas 是 datetime.datetime 类型,两类对象永远不会相等,所以特殊日期判断分支永远无法触发
  • 条件互斥逻辑错误:当前用 if...elif... 把周一发薪、特殊日期发福利两个判断做成了互斥逻辑,就算类型匹配,同一天同时满足两个条件时也只会触发第一个分支,漏算特殊日期的额外金额
  • 特殊日期年份固定:仅定义了当前年份的生日、圣诞节,时间跨年之后不会自动更新下一年的对应日期,超过1年的储蓄周期会漏算后续年份的特殊福利
  • 硬编码参数:每周扣减的金额固定写死为5,没有使用用户输入的pocket_money变量,不符合需求设计

修复后代码

import datetime as dt

current_balance = float(input("What is your current balance?: £"))
pocket_money = float(input("How much pocket money do you get per week?: £"))
goal = float(input("How much money do you need?: £"))

today = dt.date.today()

if goal <= current_balance:
    print(f"You already have enough money and you will have £{current_balance-goal} left.")
else:
    money_needed = goal - current_balance
    datetest = today
    d = dt.timedelta(days=1)
    counter = 0 
    # 初始化为date类型,和datetest保持一致
    current_year = datetest.year
    birthday = dt.date(current_year, 5, 16)
    christmas = dt.date(current_year, 12, 25)
    # 特殊日期固定额外金额,单独定义方便修改
    BONUS_AMOUNT = 200

    while money_needed > 0:
        # 先判断是否跨年,更新当年的特殊日期
        if datetest.year != current_year:
            current_year = datetest.year
            birthday = dt.date(current_year, 5, 16)
            christmas = dt.date(current_year, 12, 25)
        
        # 两个判断独立,不互斥,同时满足时两个福利都发放
        if datetest == birthday or datetest == christmas:
            money_needed -= BONUS_AMOUNT
        
        if datetest.weekday() == 0:
            money_needed -= pocket_money
            counter += 1
        
        datetest += d

    print(counter)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:45:05