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

Excel自定义数字格式:5-3轮班1.66因子排班公式失效求助

自动排班表格:5-3与6-2周轮换逻辑实现问题

我正在制作支持5-3和6-2周轮换的自动排班表格,已通过1.33因子搭配自定义数字格式实现6-2周轮换逻辑,代码如下:

If OnSite = (Days * Format(1.33, "#,##0.0033333333333333")) + 1 Then
    OnSite = 1
End If

但采用类似方式,搭配1.66因子实现5-3周轮换时无法得到预期结果,对应代码如下:

If OnSite = (Days * Format(1.66, "#,##0.0066666666666667")) + 1 Then
    OnSite = 1
End If

补充说明:Days=35,希望通过Days×1.66得到整数来触发OnSite=1的逻辑。


问题根源

使用近似浮点因子(1.33、1.66)搭配Format函数会引入精度误差:

  1. 浮点数无法精确表示分数(如1.66只是5/3的近似值,实际为1.666666...);
  2. Format返回文本格式,参与计算时的隐式转换会进一步放大误差,导致结果偏离预期。

可靠解决方案:周期模运算

5-3和6-2轮换的本质都是8天为一个完整周期(5+3=8,6+2=8),用模运算可以直接精准判断周期节点,彻底规避浮点精度问题:

6-2轮换(6天在岗,2天休息)

' 每完成一个8天周期,重置OnSite为1,开始新一轮在岗
If Days Mod 8 = 0 Then
    OnSite = 1
End If

5-3轮换(5天在岗,3天休息)

' 每完成一个8天周期,重置OnSite为1,开始新一轮在岗
If Days Mod 8 = 0 Then
    OnSite = 1
End If

若需动态更新在岗/休息状态,可调整为:

' 5-3轮换:计算当前处于周期内的天数,判断在岗/休息
OnSite = Days Mod 8
' 周期内第6-8天为休息状态,标记为0
If OnSite > 5 Then
    OnSite = 0
' 周期结束(余数为0)时,重置为1开始新一轮在岗
ElseIf OnSite = 0 Then
    OnSite = 1
End If

原逻辑修复方案(不推荐)

若坚持使用原有浮点思路,需替换为精确分数计算,避免近似值误差:

' 5-3轮换:用精确分数8/5代替近似值1.66
If OnSite = (Days * (8/5)) + 1 Then
    OnSite = 1
End If

注:该方案仍可能存在浮点数精度隐患,优先推荐周期模运算方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:18:43