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.66只是5/3的近似值,实际为1.666666...);
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
相关产品推荐
相关产品推荐

