c# - 数学舍入问题总计 > 100%

标签 c# math rounding

我有 3 个值,它们都四舍五入到没有小数位(即 5%、25%、70%),除了我的 70% 实际上是 70.6%,所以它变成 71%,这使我的总数为 5%、25%、 71% = 101% 这不好,特别是因为我有一个条形图,如果它超过 100% 宽度,就会变得非常困惑。

如何确保我的 3 个值永远不会超过 100%? 现在我正在使用 Math.Round(value,0) 是否有任何开关/选项可以用来防止我的 3 个值的总和超过 100%?

谢谢

最佳答案

如果三个值总和必须为 100,则只对其中两个值进行四舍五入并计算第三个值

third = 100 - Math.Round(a) - Math.Round(b);

注意:您的结果也可能太小。如果您有三个值 33.333333,四舍五入并相加将得到 99!


编辑(回应@BlueRajaDannyPflughoeft 的评论)

如果您有很多值,所有舍入误差的总和可能会变大。因此,将其移至最后一个值并不是一个好主意。对于这些情况,我建议连续舍入。

double[] values = new double[] { 17.2, 3.7, 4.6, 5.8 };
int[] percent = new int[values.Length];

double sum = values.Sum();
int totalPercent = 100;
for (int i = 0; i < values.Length; i++) {
    double rawPercent = sum == 0 ? 0 : values[i] / sum * totalPercent;
    sum -= values[i];
    int roundedPercent = (int)Math.Round(rawPercent);
    totalPercent -= roundedPercent;
    percent[i] = roundedPercent;
}
// values         =  { 17.2,   3.7,    4.6,    5.8 }
//
// Percents:
// percent        => { 55,     12,     15,     18 }
// raw (exact)    => { 54.952, 11.821, 14.696, 18.530 }   (rounded to 3 decimals)
// raw continuous => { 54.952, 11.809, 14.596, 18.000 }

它并不完美,但误差不应超过 1%。这是另一个例子

values         =  { 10.0,   10.0,   10.0,   10.0,   10.0,   10.0 }

Percents:
rounded        => { 17,     17,     16,     17,     16,     17 }
raw (exact)    => { 16.667, 16.667, 16.667, 16.667, 16.667, 16.667 }   
raw continuous => { 16.667, 16.600, 16.500, 16.667, 16.500  17.000 }

关于c# - 数学舍入问题总计 > 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9218576/

相关文章:

c# - 动态从文件夹加载 winforms 图标

math - 从任意角度的两点计算等边三角形的第三个点,指向科赫雪花的 "correct"方向

database - 具有单一哈希函数的 LogLog 算法如何工作

python - 为什么 Python 的无穷大哈希有 π 的数字?

Python - 将 float 四舍五入为整数的最佳方法是什么

java - java中的舍入值

mysql - 如何在 MySQL 中不四舍五入地获得精确的十进制值

c# - 实现 Azure Table 的 ITableEntity 接口(interface)以支持嵌套对象和自定义属性类型

c# - 如何从基于浏览器的游戏 Web 服务器获取本地应用程序以轮询游戏数据

c# - 为什么 SAPbobsCOM.Company COM 太慢而无法在 Windows 服务器上实例化?