c# - 如何将数量转换为最接近 100 的部分
问题描述
我正在使用下面的代码将金额分成几部分
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,
我从早上开始尝试,但没有运气。以及我检查了来自网络的可能代码,但它只提供了获得给定编号的最接近 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);
}
(注意:为简洁起见,省略了错误处理。)
推荐阅读
- c# - 在 MVVM WPF 中将一个模型连接到多个 ViewModel
- java - java.lang.ClassNotFoundException: com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier$Builder
- javascript - JQuery用替换功能擦除字段内容
- xslt - 如果多个条目中的相同文本在 XSLT 中使用 group-advancement 移动条目
- azure-devops - Azure DevOps:合并拉取请求时不要将任务状态设置为已关闭
- jquery - Datetimepicker 不是 Vue js 中的函数
- android - 如何将文本放置在抽屉标题的左下角并降低抽屉标题的高度?
- node.js - 保护 JWT 的最佳方法是什么?
- html - 用于 html 中的多个 Linux 服务器运行状况报告的 Shell 脚本,列颜色根据条件变化
- python - 如何在 Python 中为类包含可变的“标签”