如何使用C#decimal计算子数组和的百分比,使其和严格为100

如何使用C#decimal计算子数组和的百分比,使其和严格为100,c#,.net,floating-point,decimal,percentage,C#,.net,Floating Point,Decimal,Percentage,假设我有一个整数数组。为了简化,让我们从逻辑上把它分成两部分 假设数组中所有元素的总和为2860800 假设左半部分的所有元素之和为2834387 假设右半部分的所有元素之和为26413 现在通过100m*leftHalfSum/totalSum计算左半部分的百分比得到99.07672678970917225950782998 类似地,右半部分的百分比(按100m*rightHalfSum/totalSum计算)为0.9232732102908277404921700224 现在,如果我在Vis

假设我有一个整数数组。为了简化,让我们从逻辑上把它分成两部分

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

假设
左半部分的所有元素之和为
2834387

假设
右半部分的所有元素之和为
26413

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

类似地,右半部分的百分比(按
100m*rightHalfSum/totalSum
计算)为
0.9232732102908277404921700224

现在,如果我在VisualStudio的手表中添加这两个百分比,它会显示
100
。但是,如果我在Windows中的
计算器
应用程序中添加这些,它将为我提供
100.00000000000000000000000000 24
,这是正确的

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


谢谢。

小数的最大精度为28-29位有效数字()。您计算的完整结果将是30位数字长,小数点后的数字将是多少!这就是最后两位数字被省略的原因

如果结果更大(例如,总数为10.000而不是100),则会省略更多的数字


这种差异可能是由内部原因造成的,可能需要比我更有知识的人对编译后的代码进行检查。

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

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


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

@L.B,但这些不是浮点数(注意
m
在100之后)。伙计们,我知道为什么会发生这种情况。:)我需要一个很好的解决方案,使
100 lefthalf percentage
严格等于
righhalf percentage
,反之亦然。@dasblinkenlight当然它们是浮点。只有以10为基数的浮点数,而不是以2为基数。@dasblinkenlight:Decimal类型的数字也是浮点数。您可以使用
Decimal
类型精确表示某些数字,但某些数字不能使用任何数字类型精确表示。例如,例如“代码>1/3”/代码>或PI之类的数字。谢谢指点为什么这两个百分比的增加导致表中的100。