首页 > 解决方案 > GENERIC C#方法将数字四舍五入到最接近的倍数?(不是重复的,有一个特定的角度和建议的答案)

问题描述

我有一个 C# 扩展方法如下:

public static double RoundOff(this double rawNumber, double roundToNearest)
{
    double rawMultiples     = rawNumber / roundToNearest;
    double roundedMultiples = Math.Round(rawMultiples);
    double roundedNumber    = roundedMultiples * roundToNearest;
    return roundedNumber;
}

我不想为所有不同的数字类型(int、decimal 等)多次编写它。

有没有办法像这样一般地做到这一点?

public static double RoundOff<T>(this T rawNumber, T roundToNearest)
    where T : [SOME CONSTRAINT]
{
    T rawMultiples     = rawNumber / roundToNearest;
    T roundedMultiples = Math.Round(rawMultiples);
    T roundedNumber    = roundedMultiples * roundToNearest;
    return roundedNumber;
}

能够更普遍地做到这一点会非常有用。需要维护的代码更少 - 只需一种扩展方法即可获得更多功能!

如果做不到,是不是因为C#不能扩展成这种方式工作?或者有朝一日是否可以扩展以允许“所有数字类型”通用约束?

欢迎任何想法。

更新 以回应关于与另一个问题相似性的挑战。是的,就主题而言,它是相似的,但有所不同,因为我追求的是针对特定问题的特定解决方案。我在下面添加了我自己尝试的答案来澄清。如果有人仍然认为我没有抓住重点,欢迎挑战。

标签: c#numerical-methods

解决方案


正如其他评论员所说,显然不可能用泛型做你想要的,但由于所有数字都可以转换为双精度,你至少可以减少逻辑重复:

public static double RoundOff(this long rawNumber, double roundToNearest)
{
    return RoundOff((double) rawNumber, roundToNearest);
}

public static double RoundOff(this double rawNumber, double roundToNearest)
{
    T rawMultiples     = rawNumber / roundToNearest;
    T roundedMultiples = Math.Round(rawMultiples);
    T roundedNumber    = roundedMultiples * roundToNearest;
    return roundedNumber;
}

如果您在没有扩展方法的情况下进行管理,那么您可以直接在任何数字上调用此方法,因为 C# 只会自动将所有类型转换为双精度

int i = 5;
RoundOff(i, 0.5);

推荐阅读