c# - 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#不能扩展成这种方式工作?或者有朝一日是否可以扩展以允许“所有数字类型”通用约束?
欢迎任何想法。
更新 以回应关于与另一个问题相似性的挑战。是的,就主题而言,它是相似的,但有所不同,因为我追求的是针对特定问题的特定解决方案。我在下面添加了我自己尝试的答案来澄清。如果有人仍然认为我没有抓住重点,欢迎挑战。
解决方案
正如其他评论员所说,显然不可能用泛型做你想要的,但由于所有数字都可以转换为双精度,你至少可以减少逻辑重复:
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);
推荐阅读
- javascript - Fontawesome Icon SVG 未在 Firefox 中显示 Heremap Marker
- linux - 执行 sed 命令时执行错误
- c# - C#用问号替换特殊字符
- java - 从 Firebase 获取数据的 Android 片段未显示
- python - 浮点输入/Python
- apache-spark - Spark Window 函数在排序时具有滑动窗口行为
- ms-access - 如何创建受信任的 ACCDE 访问文件?
- node.js - 下载并解压缩文件而不是检查内容,异步等待问题,node.js
- r - 按因子变量分组后嵌套小标题会在 R 中产生 NULL 元素
- spring-boot - 使用 @QueryDsl 谓词和页面的测试控制器