Python开发D&D计时工具遇计时精度及AM/PM功能故障求助
修复你的D&D计时工具问题
看起来你在这款D&D计时工具上遇到了两个典型问题:浮点数精度导致的小数混乱,以及AM/PM切换逻辑失效。我来帮你拆解问题并给出修复方案:
核心问题分析
- 浮点数精度陷阱:你用
minutes_time += 0.01来累加分钟,但0.01在二进制浮点数体系里无法精确表示,多次累加后会出现大量冗余小数位(比如本该是0.2,结果变成0.19999999999999996),这就是你看到“大量零”的原因。 - AM/PM切换逻辑错误:你的切换条件是
hour_time==12 and minutes_time==0,但因为浮点数精度问题,minutes_time几乎永远不会刚好等于0;更关键的是,你的分钟累加逻辑完全错了——每次time.sleep(minutes)对应的是D&D世界的1分钟,你应该给分钟加1,而不是0.01。
修复后的完整代码
import time # 获取用户设定:现实中多少秒对应D&D的1小时 dd_hour_in_real_seconds = int(input("How many seconds is one hour in your D&D? ")) # 计算现实中多少秒对应D&D的1分钟 dd_minute_in_real_seconds = dd_hour_in_real_seconds / 60 # 初始化D&D时间参数 current_hour = 10 current_minute = 0 period = "AM" # 持续计时循环 while True: # 等待对应现实时长,推进D&D时间1分钟 time.sleep(dd_minute_in_real_seconds) current_minute += 1 # 处理分钟进位到小时 if current_minute >= 60: current_minute = 0 current_hour += 1 # 处理12小时制的小时循环 if current_hour > 12: current_hour = 1 # 切换AM/PM:当小时从11进位到12时触发 if current_hour == 12: period = "PM" if period == "AM" else "AM" # 格式化输出,确保分钟是两位数字,避免小数问题 print(f"{current_hour}:{current_minute:02d} {period}")
关键修复细节
- 用整数替代浮点数记录分钟:完全避开浮点数精度问题,输出时用
{current_minute:02d}把分钟格式化为两位数字(比如显示10:05 AM而不是10.05 AM)。 - 修正AM/PM切换逻辑:现在会在分钟进位导致小时变为12时自动切换时段,这完全符合现实12小时制的规则(11:59 AM → 12:00 PM,11:59 PM → 12:00 AM)。
- 优化变量命名:把模糊的
hour_time、minutes_time改成current_hour、current_minute,day_time改成period,代码可读性大幅提升。 - 规范循环写法:用Python原生的
while True替代true == 1,更符合Python编码习惯。
内容的提问来源于stack exchange,提问作者FreeButtPlugs
相关产品推荐
相关产品推荐

