4

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

假设total sum数组的所有元素是2860800.

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

假设 is 的所有元素的right half总和26413

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

同样,右半部分的百分比100m * rightHalfSum / totalSum0.9232732102908277404921700224

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

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

谢谢。

4

2 回答 2

2

小数的最大精度为 28-29 位有效数字(来源)。您计算的完整结果将是 30 位长,对于小数来说太多了!这就是为什么最后两位数字被省略的原因。

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

差异可能是由内部原因引起的,可能需要比我更有知识的人对编译的代码进行一些检查。

于 2012-08-27T11:27:55.633 回答
2

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

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

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

于 2012-08-27T11:31:09.850 回答