有很多人在四舍五入到最近的十分钟的例子,但我无法弄清楚四舍五入到最接近的六分之一的逻辑。我认为这将是一个转换几个数字的问题,但我不能让它工作。
与我合作的代码位于my Github。我没有接近工作的块(不会给出任何输出)是:
def companyTimer():
if minutes % 6 > .5:
companyMinutes = minutes + 1
elif minutes % 6 < 5:
companyMinutes = minutes - 1
else:
companyMinutes = minutes
print companyMinutes
现在看一下,我发现我的逻辑是不正确的 - 即使它工作正常,代码的加1和减1分是没有意义的。
无论如何,我不知道如何解决这个问题 - 有人能指出我正确的方向吗?
PS - 这是我在工作中个人使用的东西..不是在求助我的工作,但这将帮助我记录我的工作时间。不要在那里遇到任何问题。
谢谢!
答案 0 :(得分:20)
这是一个舍入到最近x
的一般函数:
def round_to_nearest(num, base):
n = num + (base//2)
return n - (n % base)
[round_to_nearest(i, 6) for i in range(20)]
# [0, 0, 0, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 18, 18, 18, 18, 18]
说明:
n % base
是将n
除以base
时剩余的余数。也称为modulo operator. num%6
中减去num
就可以得到0表示0-5,6表示6-11,依此类推。 base//2
)来偏向此结果。答案 1 :(得分:3)
如果要舍入到最近的7分钟(例如round7(3.6) => 7
,round7(17.4) => 14
),您可以使用内置round
函数的Python,如下所示:< / p>
def round7(value):
return round(value / 7.0) * 7.0
>>> round7(17.4999)
14.0
>>> round7(17.5001)
21.0
或更通用的功能:
def round_to_nearest(increment, value):
return round(value / float(increment)) * increment
>>> round_to_nearest(7, 17.4999)
14.0
>>> round_to_nearest(6, 21.0001)
24.0
答案 2 :(得分:2)
这就是你想要的吗?
def roundto6(minute):
return int((minute+3) / 6) * 6
for i in xrange(13):
print roundto6(i),
# 0 0 0 6 6 6 6 6 6 12 12 12 12 12 12
答案 3 :(得分:1)
只需使用round,将小时数转换为1位数:
>>> import time
>>> import datetime
>>> now = datetime.datetime.now()
datetime.datetime(2015, 4, 9, 20, 4, 20, 578322)
>>> datetime.datetime.fromtimestamp(round(time.mktime(w.timetuple())/3600,1)*3600)
datetime.datetime(2015, 4, 9, 20, 6, 0)
答案 4 :(得分:1)
这可能不是最聪明但可读的尝试:)
myNumber是你当前的分钟
myList = range(0, 60, 6) # [0,6,12,18,24,30,36,42,48,54] # all accepted minutes
myNumber = 8
print(min(myList, key=lambda x:abs(x-myNumber)))
答案 5 :(得分:1)
考虑的好方法是:
def companyTimer(cm):
minutes = (time.time() - starting_time) / 60
print(minutes)
if minutes % 6 >= 0.5:
cm += 1
return cm
companyTimer
只有一个参数:companyMinutes
。
>>> import time
>>> starting_time = time.time()
>>> companyMinutes = 0
>>> companyTimer(companyMinutes) # will return 0 until 3 minutes have passed
答案 6 :(得分:0)
如果你正在四舍五入,那么通用公式
x + (roundtothis - x % roundtothis)
对你有用。
我假设这是基于问题标题舍入到最接近的七,否则更改为6: 所以:
def roundUpToSeven(minute):
if ( minute % 7 == 0 and minute != 0 ):
return minute
else:
return minute + (7 - minute % 7)
查看工作示例here
答案 7 :(得分:0)
我假设你想要2轮到0,3要留3,4要圆到6.这就是你想要的吗?
def companyTimer(minutes, roundingNumber):
remainder = minutes % roundingNumber
if remainder > roundingNumber / 2:
companyMinutes = minutes - remainder + roundingNumber
elsif remainder < roundingNumber / 2:
companyMinutes = minutes - remainder
else:
companyMinutes = minutes
print companyMinutes