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