Reputation: 9
I'm making a code in python that measures time in D&D, but the its not keeping the time accurately and will sometimes give the time with a bunch of zeros after the seconds, also i cant get the am pm feature to work.
import time
hour=int(input("how many seonds is one hour in your D&D?"))
minutes = hour/60
hour_time=10
day_time="Am"
minutes_time=0.00
true = 1
while true == 1:
time.sleep (minutes)
if hour_time==12 and minutes_time==0:
if day_time=="Am":
day_time="Pm"
else:
day_time="Am"
if minutes_time>0.59:
minutes_time = 0
if hour_time==12:
hour_time = 1
else:
hour_time = hour_time + 1
else:
minutes_time = minutes_time + 0.01
print(minutes_time+hour_time,"",day_time)
Upvotes: 0
Views: 62
Reputation: 2231
The reason why you sometime get lots of zeroes is a formatting problem. You can specify a format to numbers in Python, just as in:
print("{:.2f}".format(minutes_time+hour_time),"",day_time)
Before:
10.33 Am
10.34 Am
10.35 Am
10.36 Am
10.370000000000001 Am
10.38 Am
10.39 Am
10.4 Am
After:
10.16 Am
10.17 Am
10.18 Am
10.19 Am
10.20 Am
10.21 Am
10.22 Am
10.23 Am
10.24 Am
10.25 Am
10.26 Am
Please note that over the running period of your program a precision error propagates when accumulating in minutes_time = minutes_time + 0.01
.
Floats have computing precision limits you can get rid of using Python's fractions.Fraction
for example.
Here is a working example of your code that uses Fraction
:
import time
from fractions import Fraction
hour=int(input("how many seonds is one hour in your D&D?"))
minutes = hour/60
hour_time=10
day_time="Am"
minutes_time=Fraction(0, 1)
true = 1
while true == 1:
time.sleep (minutes)
if hour_time==12 and minutes_time==0:
if day_time=="Am":
day_time="Pm"
else:
day_time="Am"
if minutes_time>=Fraction(59, 100):
minutes_time = 0
if hour_time==12:
hour_time = 1
else:
hour_time = hour_time + 1
else:
minutes_time = minutes_time + Fraction(1, 100)
print("{:.2f}".format(float(minutes_time)+hour_time),"",day_time)
Upvotes: 1