我使用以下代码将金额分成几部分
public static IEnumerable<int> DistributeInteger(double total, int divider)
{
if (divider == 0)
{
yield return 0;
}
else
{
double rest = total % divider;
double result = total / (double)divider;
for (int i = 0; i < divider; i++)
{
if (rest-- > 0)
yield return (int)Math.Ceiling(result);
else
yield return (int)Math.Floor(result);
}
}
}
并按如下方式使用它
var test = DistributeInteger(5000, 4).ToList();
上面的代码返回我。
1250
1250
1250
1250
(所有四部分之和 = 5000(
但是我需要它作为每个部分的最接近的 100 个,例如
1300
1300
1300
1100
如果我通过
var test = DistributeInteger(5219, 5).ToList();
然后它正在返回
1044
1044
1044
1044
1043
(所有五个部分的总和 = 5219(但它应该是
1000
1000
1000
1000
1000
219
如果金额 1 到 100,例如 89,那么它将返回相同的金额,即 89,
我从早上开始尝试,但没有运气。以及我从网络中检查的 5 月代码,但它只给出了获得给定编号的最接近 100 值的解决方案。
这个怎么样?
public static IEnumerable<int> DistributeInteger(double total, int divider)
{
int part = 100 * ((int)(50 + total / divider) / 100);
if (part == 0)
{
yield return (int)total;
yield break;
}
double runningTotal = 0;
while (runningTotal <= (total - part))
{
yield return part;
runningTotal += part;
}
if (runningTotal < total)
yield return (int) (total - runningTotal);
}
(注意:为简洁起见,省略了错误处理。
怎么样:
public static IEnumerable<int> DistributeInteger(double total, int divider)
{
// get increment to the nearest hundred
var increment = (int) Math.Round(total/ 100 / divider, MidpointRounding.AwayFromZero) * 100;
// make sure increment is non-zero
if (increment == 0) increment = 100;
var remainder = (int) total;
// subtract increment while remainder is >= zero
while (remainder >= increment){
remainder -= increment;
yield return increment;
}
// check if remainder is non-zero
if (remainder > 0)
yield return remainder;
}
现在使用天花板
似乎适用于中点从零四舍五入
这种方法怎么样:
public static IEnumerable<int> DistributeInteger(double total, int divider)
{
if (divider == 0)
{
return null;
}
else
{
var parts = new List<int>();
var singlePart = total / divider;
singlePart = Math.Round(singlePart / 100, MidpointRounding.AwayFromZero) * 100;
while (total - singlePart > 0)
{
parts.Add((int)singlePart);
total -= singlePart;
}
// Add remainnig value.
parts.Add((int)total);
return parts;
}
}
它仅适用于第二种情况,对于第一种情况,您需要使用Ceiling
函数而不是Round
。