Python 2 - 你如何向上/向下舍入到最近的6分钟?

Ros*_*rup 15 python datetime python-2.7

有很多人围绕到最近的十分钟的例子,但我无法弄清楚四舍五入到最接近的六分之一的逻辑.我认为这将是一个转换几个数字的问题,但我不能让它工作.

我正在使用的代码位于我的Github.我得到的块甚至没有接近工作(不会给出任何输出)是:

def companyTimer():
    if minutes % 6 > .5:
        companyMinutes = minutes + 1
    elif minutes % 6 < 5:
        companyMinutes = minutes - 1
    else:
        companyMinutes = minutes
    print companyMinutes
Run Code Online (Sandbox Code Playgroud)

现在看一下,我看到我的逻辑是不正确的 - 即使它正在工作,代码的加1和减1分是没有意义的.

无论如何,我不知道如何解决这个问题 - 有人能指出我正确的方向吗?

PS - 这是我在工作中为个人使用而制作的东西..不要求我的工作帮助,但这将帮助我跟踪我的工作时间.不希望有任何问题.

谢谢!

tza*_*man 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]
Run Code Online (Sandbox Code Playgroud)

说明:

  • n % base是将当余留下来nbase.也称为模运算符.
  • 简单地减去num%6num会给你0 0-5,6 6-11,等等.
  • 由于我们想要"舍入"而不是"地板",我们可以通过base//2预先添加一半base()来偏置此结果.

  • 这很棒!我确定这是CS101的东西,但作为一个自学成才的程序员,我已经走了太长时间而不知道一般的算法.谢谢! (2认同)
  • 为了完整,你介意用几句话解释吗? (2认同)
  • 你为什么用shift而不是divide? (2认同)
  • 如果你的意思是除以2,请使用`// 2`而不是`>> 1`.只有在处理位模式时才应使用双移位. (2认同)