You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于特定规则的Decimal值取整实现方案咨询

Decimal数值自定义取整实现方案

需求说明

持有decimal类型的数值,仅在满足以下条件时执行自定义取整逻辑:

  • 数值大于300
  • 整数部分以5或9结尾
    取整后需将结果的小数位置为0,其余情况直接返回原数值。

取整逻辑规则

整数部分结尾为9的取整规则

向下取整场景

数值结尾取整至示例输入最终结果
999609599
1999319.45299
19991019999

向上取整场景1(结尾29/39)

数值结尾取整至示例输入最终结果
2949429449
3949439.88449

向上取整场景2(结尾59/69/79/89)

数值结尾取整至示例输入最终结果
59991059.121099
699910691099
799910791099
899910891099

整数部分结尾为5的取整规则

该逻辑与上述类似,仅取整目标替换为5结尾的数值:

向下取整场景

数值结尾取整至示例输入最终结果
595605595
1595315.45295
15951015995

向上取整场景1(结尾25/35)

数值结尾取整至示例输入最终结果
2545425445
3545435.88445

向上取整场景2(结尾55/65/75/85)

数值结尾取整至示例输入最终结果
55951055.121095
659510651095
759510751095
859510851095

实现代码

基于提供的初始代码,补充完整逻辑如下(注释已翻译为中文):

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:00:01