【问题标题】:Integer math in c#c#中的整数数学
【发布时间】:2008-10-30 13:35:03
【问题描述】:

我有一个产品品牌菜单,我想分成 4 列。因此,如果我有 39 个品牌,那么我希望每列的最大项目数为 10(最后一列有一个空白。这是我计算列的项目数的方法(使用 C#):

int ItemCount = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(BrandCount) / 4m));

所有这些转换对我来说都很难看。有没有更好的方法在 C# 中对整数进行数学运算?

【问题讨论】:

    标签: c# math casting rounding


    【解决方案1】:

    你可以投:

    int ItemCount = (int) Math.Ceiling( (decimal)BrandCount / 4m );
    

    另外,因为int/decimal 会产生decimal,所以您可以删除其中一个演员表:

    int ItemCount = (int) Math.Ceiling( BrandCount / 4m );
    

    【讨论】:

    • 这就是我要写的。 +1。
    • 这是我最后写的。 :) +1 也是如此。
    • 怎么可能,最糟糕的答案得到最多的赞扬?这是一个不能做的例子。
    • @bestsss - 为什么这是最糟糕的答案?
    • @David,b/c 通常(并非总是)使用浮点运算来解决整数问题是不好的。但是依赖 128 位浮点(十进制)只是矫枉过正,当然要付出代价将其从 int -> decimal 转换回来。
    【解决方案2】:

    你为什么还要使用小数?

    int ItemCount = (BrandCount+3)/4;
    

    +3 确保您向上取整而不是向下取整:

    (37+3)/4 == 40/4 == 10
    (38+3)/4 == 41/4 == 10
    (39+3)/4 == 42/4 == 10
    (40+3)/4 == 43/4 == 10
    

    一般:

    public uint DivUp(uint num, uint denom)
    {
        return (num + denom - 1) / denom;
    }
    

    【讨论】:

    • 我喜欢这个技巧,但我认为更难看出代码的用途。我接受的答案很容易返回和维护。
    • 你说是个把戏?我不羡慕你试图维护除了最琐碎的程序之外的任何程序......
    • 说真的 — ceil(a/b)=((a+b-1)/b) 是程序员在 C# 之前使用多年的“技巧”。
    【解决方案3】:

    Mod 的更长替代方案。

    ItemCount = BrandCount / 4;
    if (BrandCount%4 > 0) ItemCount++;
    

    【讨论】:

      【解决方案4】:

      也许尝试这样的事情......假设BrandCount 是一个整数。您仍然有相同的演员表,但可能更清楚:

      int ItemCount = (int)(Math.Ceiling(BrandCount / 4m));
      

      我不是Convert 类的忠实粉丝,我尽可能避免使用它。它似乎总是让我的代码难以辨认。

      【讨论】:

      • 我完全同意你的看法 -> Convert.ToInt32(foo) 与 (int)foo 相比是丑陋的。
      • 那么演员做的事情和转换完全一样吗?
      • @Ben Mills:在这种情况下,是的(转换数字)。一般来说,没有。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      相关资源
      最近更新 更多