基于特定规则的Decimal值取整实现方案咨询
Decimal数值自定义取整实现方案
需求说明
持有decimal类型的数值,仅在满足以下条件时执行自定义取整逻辑:
- 数值大于300
- 整数部分以
5或9结尾
取整后需将结果的小数位置为0,其余情况直接返回原数值。
取整逻辑规则
整数部分结尾为9的取整规则
向下取整场景
| 数值结尾 | 取整至 | 示例输入 | 最终结果 |
|---|---|---|---|
| 9 | 99 | 609 | 599 |
| 19 | 99 | 319.45 | 299 |
| 19 | 99 | 1019 | 999 |
向上取整场景1(结尾29/39)
| 数值结尾 | 取整至 | 示例输入 | 最终结果 |
|---|---|---|---|
| 29 | 49 | 429 | 449 |
| 39 | 49 | 439.88 | 449 |
向上取整场景2(结尾59/69/79/89)
| 数值结尾 | 取整至 | 示例输入 | 最终结果 |
|---|---|---|---|
| 59 | 99 | 1059.12 | 1099 |
| 69 | 99 | 1069 | 1099 |
| 79 | 99 | 1079 | 1099 |
| 89 | 99 | 1089 | 1099 |
整数部分结尾为5的取整规则
该逻辑与上述类似,仅取整目标替换为5结尾的数值:
向下取整场景
| 数值结尾 | 取整至 | 示例输入 | 最终结果 |
|---|---|---|---|
| 5 | 95 | 605 | 595 |
| 15 | 95 | 315.45 | 295 |
| 15 | 95 | 1015 | 995 |
向上取整场景1(结尾25/35)
| 数值结尾 | 取整至 | 示例输入 | 最终结果 |
|---|---|---|---|
| 25 | 45 | 425 | 445 |
| 35 | 45 | 435.88 | 445 |
向上取整场景2(结尾55/65/75/85)
| 数值结尾 | 取整至 | 示例输入 | 最终结果 |
|---|---|---|---|
| 55 | 95 | 1055.12 | 1095 |
| 65 | 95 | 1065 | 1095 |
| 75 | 95 | 1075 | 1095 |
| 85 | 95 | 1085 | 1095 |
实现代码
基于提供的初始代码,补充完整逻辑如下(注释已翻译为中文):
public decimal ProcessFormatting(decimal value) { // 仅对大于300的数值进行处理,否则直接返回原数值 if (value <= 300) return value; // 获取数值的整数部分 long integerPart = (long)Math.Truncate(value); // 取整数部分的最后两位,用于判断结尾规则 int lastTwoDigits = (int)(integerPart % 100); // 取整数部分除以100的商,用于计算基准值 long hundredBase = integerPart / 100 * 100; // 判断整数部分结尾是否为9或5 int lastDigit = (int)(integerPart % 10); if (lastDigit != 9 && lastDigit != 5) { return value; } decimal result = 0; if (lastDigit == 9) { switch (lastTwoDigits) { case 9: case 19: // 向下取整到前一个99结尾的数值 result = hundredBase - 1; break; case 29: case 39: // 向上取整到当前区间的49结尾 result = hundredBase + 49; break; case 59: case 69: case 79: case 89: // 向上取整到当前区间的99结尾 result = hundredBase + 99; break; default: // 未匹配到规则的情况,返回原数值(可根据需求调整) result = value; break; } } else if (lastDigit == 5) { switch (lastTwoDigits) { case 5: case 15: // 向下取整到前一个95结尾的数值 result = hundredBase - 5; break; case 25: case 35: // 向上取整到当前区间的45结尾 result = hundredBase + 45; break; case 55: case 65: case 75: case 85: // 向上取整到当前区间的95结尾 result = hundredBase + 95; break; default: // 未匹配到规则的情况,返回原数值(可根据需求调整) result = value; break; } } // 确保结果小数位为0 return Decimal.Round(result, 0); }
代码说明
- 先过滤掉小于等于300的数值,直接返回
- 通过取模运算获取整数部分的最后一位和最后两位,判断匹配的取整规则
- 根据不同的结尾情况,计算对应的取整结果
- 最终通过
Decimal.Round确保结果小数位为0
内容的提问来源于stack exchange,提问作者Arie
相关产品推荐
相关产品推荐

