gpt4 book ai didi

rounding - 如何对总和为 100% 的一组数字进行四舍五入

转载 作者:行者123 更新时间:2023-12-01 01:02:55 28 4
gpt4 key购买 nike

今天,我的一个 friend 向我展示了一个网站上的错误。 (Link)
您可以看到百分比之和为 100.1%。

49 + 20.7 + 10.9 + 7 + 5.5 + 7 = 100.1%


我想:如果我在编程并且有那些 7 个(浮点数)数字,我该如何解决这个问题?

假设所有数字都有一位小数:

49.0 + 20.7 + 10.9 + 7.0 + 5.5 + 7.0 = 100.1%


我相信这是一个四舍五入的问题,我没有看到该错误的其他解释。

e.g.:

49.5% + 50.5% = 100%, if we round them up, 50% + 51% = 101%.

But in this case, because we have two numbers, we could use the round to even.

49.5% + 50.5% = 100%, if we round to even, 50% + 50% = 100%.


这些数字已经被污染了,因为它们的总和是 100.1%,因此,至少有一个数字等于他自己的负 0.5。
在这个 7 数字示例中,舍入到偶数不起作用,因为它不会在以下总和中:

49 + 20.65 + 10.85 + 7 + 5.5 + 7 = 100%

49 + 20.6 + 10.8 + 7 + 5.5 + 7 = 99.9%


有没有简单/快速的方法来解决这个问题?使用不同的舍入方法?
或者我解决这个问题的唯一方法是创建一个函数来专门处理我的问题?

注意:我不是在寻找特定的编程语言方法。我希望我可以用不同的语言(例如在 PHP 和 C++ 中)解决这个问题。

最佳答案

首先,您对可能原因的分析并不是这里的实际原因。
但是你所说的概念叫做偏见 在舍入方案中。它确实存在并且是真实的——它只是不是你这里特定问题的原因。

在您声称导致这种情况的示例中:49.5% + 50.5% = 100%,四舍五入,50% + 51% = 101%。
对于正数,向上舍入(向正无穷大舍入)等效于从零舍入。请参阅下面的舍入方案列表 1 .
但同样,这不太可能是这里的原因,除非您碰巧得到两个相同等于 a.5 和 b.5 的相邻数字,而不是 a.7 + b.8 + c.5,或任何其他组合数字。
为了证明为什么这不是真正的原因,在这个 n 数字列表中,有 (n-1) 对相邻对,如果我们合理假设每个最后一位数字的概率相等,那么获得相邻数字的机会为 a。 5、b.5只有(0.1)^2 = 0.01

无论如何,真正的原因是缺少精度引入的数值错误(由于转换为字符串 '%2.1f' 的数字的截断表示) (无论他们使用哪种语言,大概是 PHP、Javascript 或 Java)...

通常和最简单的解决方案是 只需携带更多精度 .严格来说,这里可能只需要一位(或两位)数字,但 IEEE 754 floats give you 23 digits of mantissa for free, so everyone uses that .

但是,如果您真的坚持为自己设置缺少精度的舍入数字的(人为)挑战,并且在它们总和必须为 100.0%(或最大化它们的可能性)的约束下,有几种较少使用的舍入方案。
您可以在教科书中找到这些,但由于显而易见的原因,它们在现实世界中的使用并不多,因为它们引入了随机性和可能的​​不确定性(尽管您可以设置随机种子,以至少确保可重复性)。

因此,对于这里的任何值(value)都是这些舍入方案(以及许多其他方案,请参阅整篇文章):

[2] http://en.wikipedia.org/wiki/Rounding#Tie-breaking

以下所有结果都会导致 q=.5 情况下的偏差,并且您说您想完全避免使用它们(而不是携带额外的精度,这会使问题消失):

  • 上半圆
  • 圆形减半
  • 距零半圆
  • 向零舍入一半
  • 轮到一半
  • 圆半到奇数

  • 现在这里是你感兴趣的:
  • 随机舍入:
    另一种无偏的决胜局方法是随机舍入:

  • 如果 y 的小数部分为 .5,则在 y + 0.5 和 y − 0.5 中随机选择 q,概率相等。
    优点:基本没有整体偏见;但它在偶数和奇数 q 值之间也是“公平的”。另一方面,它在结果中引入了一个随机分量;对相同的数据执行两次相同的计算可能会产生两种不同的结果。此外,如果人类(而不是计算机或偶然设备)“随机”决定朝哪个方向舍入,则无意识偏见是开放的。
  • 交替打破平局:
    一种比大多数方法更晦涩的方法是交替圆半。

  • 如果小数部分为 0.5,则交替向上舍入和向下舍入:对于 0.5 小数部分第一次出现,向上舍入;对于第二次出现,向下取整;等等等等。
    如果可以有效地对出现的 0.5 个小数部分进行编号,这将抑制结果的随机分量。但如果出现的总数是奇数,它仍然可以根据分配给第一次出现的舍入方向引入正偏差或负偏差。

    如果你想阅读所有关于这些东西(计算机算法,以及实现它的硬件电路),一个很好的引用(在硬件方面很重要)是

    Computer Arithmetic Algorithms, 2nd Edition by Israel Koren www.ecs.umass.edu/ece/koren/arith/‎ University of Massachusetts Amherst, 2010

    关于rounding - 如何对总和为 100% 的一组数字进行四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21581341/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com