如何内置.Net算法以将值舍入到最近的10个区间?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

如何在C#中将任意值舍入到10个区间?例如,如果我有11个,我希望它返回10,如果我有136,那么我希望它返回140。

我可以轻松地手工完成

return ((int)(number / 10)) * 10;

但是我正在寻找一个内置算法来完成这项工作,例如Math.Round()。我不想亲手做的原因是我不想在我的项目中编写相同或相似的代码片段,即使是像上面那样简单的东西。

提问于
用户回答回答于

类库中没有内置函数可以执行此操作。最接近的是System.Math.Round(),它仅用于将Decimal和Double类型的数字舍入为最接近的整数值。但是,如果正在使用.NET 3.5,则可以将扩展方法中的语句包装起来,这将可以更加干净地使用该函数。

public static class ExtensionMethods
{
    public static int RoundOff (this int i)
    {
        return ((int)Math.Round(i / 10.0)) * 10;
    }
}

int roundedNumber = 236.RoundOff(); // returns 240
int roundedNumber2 = 11.RoundOff(); // returns 10

如果是针对旧版.NET Framework进行编程,只需从RoundOff函数中删除“this”,然后像这样调用函数:

int roundedNumber = ExtensionMethods.RoundOff(236); // returns 240
int roundedNumber2 = ExtensionMethods.RoundOff(11); // returns 10
用户回答回答于

使用Math.Ceiling总是四舍五入。

int number = 236;
number = (int)(Math.Ceiling(number / 10.0d) * 10);

模数(%)得到余数,所以你得到:

// number = 236 + 10 - 6

将其放入扩展方法中

public static int roundupbyten(this int i){
    // return i + (10 - i % 10); <-- logic error. Oops!
    return (int)(Math.Ceiling(i / 10.0d)*10); // fixed
}

// call like so:
int number = 236.roundupbyten();

在计算upc校验位时写到了这一点。

扫码关注云+社区