在C# .NET中如何将小数向上取整至0.5或0.25?
在C# .NET中实现decimal的指定粒度取整
首先需要明确两种可能的需求(根据你的示例描述,存在两种理解方向):
一、按照你的示例逻辑取整
你的示例显示的是按指定粒度“就近取整到0.5的倍数”,具体规则:
规则1:按0.5粒度取整(结果为整数)
- 若小数部分 < 0.5,取整数部分
- 若小数部分 ≥ 0.5,取整数部分+1
对应示例:1.4→1,1.6→2
规则2:按0.25粒度取整(结果为0.5的倍数)
- 若小数部分 < 0.25,取整数部分
- 若0.25 ≤ 小数部分 < 0.75,取整数部分+0.5
- 若小数部分 ≥ 0.75,取整数部分+1
对应示例:1.2→1,1.26→1.5,1.75→2
实现代码:
// 按0.5粒度取整(结果为整数) public static decimal RoundToHalfInteger(decimal value) { var integerPart = decimal.Truncate(value); var fractionalPart = value - integerPart; return fractionalPart >= 0.5m ? integerPart + 1 : integerPart; } // 按0.25粒度取整(结果为0.5的倍数) public static decimal RoundToHalfStep(decimal value) { var integerPart = decimal.Truncate(value); var fractionalPart = value - integerPart; if (fractionalPart < 0.25m) return integerPart; else if (fractionalPart < 0.75m) return integerPart + 0.5m; else return integerPart + 1; }
二、真正的“向上取整到0.5/0.25的倍数”
如果你的需求是取大于等于原数的最小的指定粒度倍数(这是标准的向上取整定义),规则如下:
规则1:向上取整到0.5的倍数
- 1.4→1.5(大于等于1.4的最小0.5倍数)
- 1.6→2.0(大于等于1.6的最小0.5倍数)
规则2:向上取整到0.25的倍数
- 1.2→1.25(大于等于1.2的最小0.25倍数)
- 1.26→1.5(大于等于1.26的最小0.25倍数)
- 1.75→1.75(本身就是0.25的倍数)
实现代码:
利用decimal.Ceiling方法,通过缩放数值来实现:
// 向上取整到0.5的倍数 public static decimal CeilingToHalf(decimal value) { // 将数值放大2倍,向上取整后再缩小2倍 return decimal.Ceiling(value * 2) / 2; } // 向上取整到0.25的倍数 public static decimal CeilingToQuarter(decimal value) { // 将数值放大4倍,向上取整后再缩小4倍 return decimal.Ceiling(value * 4) / 4; }
验证示例:
// 向上取整到0.5的倍数 Console.WriteLine(CeilingToHalf(1.4m)); // 输出1.5 Console.WriteLine(CeilingToHalf(1.6m)); // 输出2.0 // 向上取整到0.25的倍数 Console.WriteLine(CeilingToQuarter(1.2m)); // 输出1.25 Console.WriteLine(CeilingToQuarter(1.26m)); // 输出1.5 Console.WriteLine(CeilingToQuarter(1.75m)); // 输出1.75
内容的提问来源于stack exchange,提问作者Pjcode
相关产品推荐
相关产品推荐

