如何使用C#decimal计算子数组和的百分比,使其和严格为100
假设我有一个整数数组。为了简化,让我们从逻辑上把它分成两部分 假设数组中所有元素的总和为2860800 假设如何使用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
左半部分的所有元素之和为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。