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

Python基于全天、半天规则向上取整休假天数的实现问题

问题解答

原代码问题点

  • 小数部分小于5时直接对整数部分减1的逻辑完全错误,会导致1.25这类值得到0、0.33得到负数,完全不符合需求
  • 拆分小数部分的处理方式不稳定,比如2.5拆分后小数部分是5不是50,判断等于5的逻辑很容易出边界问题
  • 依赖字符串拆分和Decimal类型做简单的小数判断,冗余且易出精度问题
  • 最终返回字符串格式的结果,后续计算或使用都不方便

匹配规则梳理

先从示例提炼明确的统一规则:

先将计算值保留两位小数,拆分出整数部分n和小数部分的百分位值f(如1.67对应n=1,f=67):

  1. 若f > 50:向上取整为n+1天
  2. 若f == 50:取值为n+0.5天(即n天半)
  3. 若f < 50:如果n为0则取0.5天,否则取n天

修正后实现代码

def calculate_leave_days(total_leaves):
    # 计算保留两位小数的月度假期
    monthly_leaves = round(total_leaves / 12, 2)
    n = int(monthly_leaves)
    # 计算百分位的小数部分,加0.5避免浮点精度误差导致的取值错误
    f = int((monthly_leaves - n) * 100 + 0.5)
    
    if f > 50:
        return n + 1
    elif f == 50:
        return n + 0.5
    else:
        # 小数部分小于50的场景分支
        return 0.5 if n == 0 else n

# 测试用例
print(calculate_leave_days(30))  # 输出2.5
print(calculate_leave_days(20))  # 输出2
print(calculate_leave_days(15))  # 输出1
print(calculate_leave_days(4))   # 输出0.5

结果验证

上述代码运行输出和需求示例完全匹配:

  • 30 → 2.5(对应2天半)
  • 20 → 2(符合要求)
  • 15 → 1(符合要求)
  • 4 → 0.5(对应半天)

内容的提问来源于stack exchange,提问作者rahul.m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:03