c# - 如何使用 C# decimal 计算子数组总和的百分比,使它们的总和严格为 100

标签 c# .net floating-point decimal percentage

假设我有一个整数数组。为了简化起见,让我们在逻辑上将其分为两部分。

假设数组所有元素的总和2860800

假设 left half 所有元素的总和是 2834387

假设右半部分所有元素的总和是26413

现在通过 100m * leftHalfSum/totalSum 计算左半部分的百分比得到 99.07672678970917225950782998

同样,100m * rightHalfSum/totalSum 的右半部分百分比为 0.9232732102908277404921700224

现在,如果我在 Visual Studio 的 Watch 中添加这两个百分比,它会显示 100。但是,如果我在 Windows 的 Calculator 应用程序中添加这些,它会给我 100.0000000000000000000000000024,这是正确的。

基本上,我希望 100-leftHalfPercentage 严格等于 rightHalfPercentage,反之亦然。如果我在 Watch 中执行 100-leftHalfPercentage,它会给我 0.92327321029082774049217002。请注意,它与 rightHalfPercentage 完全相同,但缺少最后两位数字 24

谢谢。

最佳答案

您计算的数字是正确的,即它们以相同的精度表示百分比。

如果您希望它们的总和恰好为 100,那么您必须选择一个不太精确的值。您选择牺牲的值(value)将简单地通过从 100 中减去所有其他值(value)来计算。

例如,如果三个相等的组用一位小数计算,每个组将为 33.3%,总和为 99.9%。要使总和 100%,您需要牺牲一组的正确性并将其计算为 100 - 33.3 - 33.3 = 33.4

关于c# - 如何使用 C# decimal 计算子数组总和的百分比,使它们的总和严格为 100,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12140975/

相关文章:

c# - 如何使用 iOS 5 在 MonoTouch 中获得订阅支持

c# - FakeItEasy:从返回 null 的 protected 方法获取参数

C# MySql 超时已过期

performance - 正确处理 ISO-Prolog 中的非正规 float

python - Z3py:Float32() 和 BitVecSort(32) 之间的强制和值提取

c# - 如何使用 NServiceBus 执行集成测试?

c# - 如何使用 log4net 在日志文件中添加一个空行?

c - 将十进制定点/浮点格式打印为十六进制

asp.net - ContentPlaceHolderID 作为前缀添加到我的表单字段

c# - Ping 网络上的主机名