代码之家  ›  专栏  ›  技术社区  ›  Peanut

C-将时间值四舍五入到最近的四分之一小时

  •  9
  • Peanut  · 技术社区  · 15 年前

    有人能绕过去吗 向下 一个介于0和59之间的数,精确到15。 我用的是C 3.5。

    所以…

    • 1是0
    • 29是15
    • 30是30

    多谢。

    6 回复  |  直到 15 年前
        1
  •  24
  •   Tanzelax    15 年前

    x = x - (x % 15) 将是一个不依赖整数除法的解决方案。

        2
  •  10
  •   johnc    15 年前

    作为日期时间的扩展方法

    public static DateTime RoundDown(this DateTime dateTime)
    {
        return new DateTime(dateTime.Year, dateTime.Month, 
             dateTime.Day, dateTime.Hour, (dateTime.Minute / 15) * 15, 0);
    }
    

    使用

    DateTime date = dateTime.Now.RoundDown();//for example
    
        3
  •  5
  •   No Refunds No Returns    15 年前

    (X/15)*15怎么样?

        4
  •  4
  •   Paul Kohler    15 年前

    我不知道是否有这样的库调用(如.round(…)),扩展方法是否适合?

    我想做一个简单的if语句。

    如果速度有问题,请尝试对每个值使用扩展的switch语句。如果这是一个问题,使用单元测试来查看更快的速度。

    要完成…

    //...
    [TestMethod]
        public void round_down()
        {
            Assert.AreEqual(-5.RoundDown(), 0);
            Assert.AreEqual(0.RoundDown(), 0);
            Assert.AreEqual(1.RoundDown(), 0);
            Assert.AreEqual(20.RoundDown(), 15);
            Assert.AreEqual(42.RoundDown(), 30);
            Assert.AreEqual(48.RoundDown(), 45);
            Assert.AreEqual(59.RoundDown(), 45);
            Assert.AreEqual(90.RoundDown(), 45);
        }
    

    /…

    public static class Ext
    {
        public static int RoundDown(this int val)
        {
            if (val < 0)
                return 0;
            if (val < 15)
                return 0;
            if (val < 30)
                return 15;
            if (val < 45)
                return 30;
            return 45;
        }
    }
    
        5
  •  3
  •   Reed Copsey    15 年前

    可以使用整数除法-

    int number = 43;
    int newNumber = number / 15;
    int rounded = newNumber * 15;
    
        6
  •  0
  •   Fadrian Sudaman    15 年前

    这就是模算符真正有用的地方。

    number - (number % 15)