C# 获取整数c的分层数量百分比

C# 获取整数c的分层数量百分比,c#,C#,考虑以下关于佣金支付的场景: 高达10万-1% 10万至20万-2% 200k+-3% 如果销售人员销售40万,他们将获得10万的1%、10万的2%和20万的3% 我知道用一系列if语句可以很容易地解决这个问题,但我正在寻找一个优雅的解决方案 数据模型的结构如下: class SalesCommissionInvoiceSummaryModel { public SalesCommissionInvoiceSummaryModel() { } public string

考虑以下关于佣金支付的场景:

高达10万-1% 10万至20万-2% 200k+-3% 如果销售人员销售40万,他们将获得10万的1%、10万的2%和20万的3%

我知道用一系列if语句可以很容易地解决这个问题,但我正在寻找一个优雅的解决方案

数据模型的结构如下:

class SalesCommissionInvoiceSummaryModel
{
    public SalesCommissionInvoiceSummaryModel() { }
    
    public string SalesPerson { get; set; }
    public decimal CommissionableAmount { get; set; }
    public decimal CommissionAmount { get; set; }
}
如果x是工资,你可以这样计算佣金:

decimal commission = (decimal) (Math.Min(100000, x) * 0.01 + 
   Math.Min(100000, Math.Max(0, x - 100000)) * 0.02 + 
   Math.Max(0, x - 200000) * 0.03);
试一试:

如果x是工资,你可以这样计算佣金:

decimal commission = (decimal) (Math.Min(100000, x) * 0.01 + 
   Math.Min(100000, Math.Max(0, x - 100000)) * 0.02 + 
   Math.Max(0, x - 200000) * 0.03);
试一试:
下面是另一种使用“Math.Min”的方法

var commissionBands = new[]
        {
            new { Lower = 0m, Upper = 100000m, Rate = 1 },
            new { Lower = 100000m, Upper = 200000m, Rate = 2 },
            new { Lower = 200000m, Upper = decimal.MaxValue, Rate = 3 }
        };

var sales = 400000m; 

var commissionAmount = 0m;

foreach (var band in commissionBands)
{
    if (sales > band.Lower)
    {
        var commission = Math.Min(band.Upper - band.Lower, sales - band.Lower);
        var commissionatthisband = commission * band.Rate * 0.01m;
        commissionAmount += commissionatthisband;
    }
}

Console.WriteLine(commissionAmount); 

下面是使用“Math.Min”的另一种方法

var commissionBands = new[]
        {
            new { Lower = 0m, Upper = 100000m, Rate = 1 },
            new { Lower = 100000m, Upper = 200000m, Rate = 2 },
            new { Lower = 200000m, Upper = decimal.MaxValue, Rate = 3 }
        };

var sales = 400000m; 

var commissionAmount = 0m;

foreach (var band in commissionBands)
{
    if (sales > band.Lower)
    {
        var commission = Math.Min(band.Upper - band.Lower, sales - band.Lower);
        var commissionatthisband = commission * band.Rate * 0.01m;
        commissionAmount += commissionatthisband;
    }
}

Console.WriteLine(commissionAmount); 

支出没有意义。。。在200k和300k之间会发生什么?佣金pct=intMath.MinCommissionableAmount,300000/100000;?对不起,打字错误。问题已经更新了支出没有意义。。。在200k和300k之间会发生什么?佣金pct=intMath.MinCommissionableAmount,300000/100000;?对不起,打字错误。问题已更新此解决方案不是非常灵活或动态的,每次要更改层时,都必须修改算法。基于列表的方法似乎是IMHO中最优雅的解决方案。@silkfire我同意,在RL中也是如此。只是不清楚OP的优雅是什么意思,特别是因为他们不想要一系列的陈述。你能发布一个基于列表的方法吗?我想看看你认为什么是“最好”的解决方案。@JeremyHodge想知道另一个答案。这个解决方案不是很灵活或动态的,每次你想对层进行更改时,都必须修改算法。基于列表的方法似乎是IMHO中最优雅的解决方案。@silkfire我同意,在RL中也是如此。只是不清楚OP的优雅是什么意思,特别是因为他们不想要一系列的陈述。你能发布一个基于列表的方法吗?我想看看你认为“最好”的解决方案是什么。@JeremyHodge想知道另一个答案。