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

2024-03-20

今天,我的一位朋友向我展示了网站上的一个错误。(Link) http://img594.imageshack.us/img594/7605/mrul.png

您可以看到百分比之和为 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%,如果我们四舍五入的话,50% + 51% = 101%。

但在这种情况下,因为我们有两个数字,所以我们可以使用舍入来求偶。

49.5% + 50.5% = 100%,如果四舍五入的话,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++)解决这个问题。


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

在您声称造成此情况的示例中:49.5% + 50.5% = 100%,向上舍入,50% + 51% = 101%。 对于正数,向上舍入(向正无穷大舍入)相当于从零舍入。请参阅下面的舍入方案列表1 https://stackoverflow.com/questions/13542944/how-many-significant-digits-have-floats-and-doubles-in-java。 但同样,这不太可能是这里的原因,除非您碰巧得到两个相同等于 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 浮点数免费为您提供 23 位尾数,因此每个人都使用它 https://stackoverflow.com/questions/13542944/how-many-significant-digits-have-floats-and-doubles-in-java.

然而,如果您确实坚持要给自己设置一个(人为的)挑战,即在精度缺失的情况下对数字进行舍入,并且在总和必须达到 100.0%(或最大化其达到 100.0% 的可能性)的约束下,有几种较少使用的舍入方案。 您可以在教科书中找到它们,但由于明显的原因,它们在现实世界中并没有太多使用,因为它们引入了随机性和可能的​​不确定性(尽管您可以设置随机种子,以至少确保可重复性)。

因此,无论这里的值如何,这些舍入方案(以及许多其他舍入方案,请参阅整篇文章):

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

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

  • 将一半向上舍入
  • 向下圆一半
  • 从零舍入一半
  • 将一半向零舍入
  • 将一半舍入到偶数
  • 四舍五入到奇数

现在,以下是您感兴趣的内容:

  • 随机舍入: 另一种无偏平局打破方法是随机舍入:

如果 y 的小数部分为 0.5,则以等概率在 y + 0.5 和 y − 0.5 中随机选择 q。 优点:基本上没有整体偏见;但它在偶数和奇数 q 值中也是“公平的”。另一方面,它在结果中引入了随机成分;对相同的数据执行两次相同的计算可能会产生两个不同的结果。此外,如果人类(而不是计算机或随机设备)“随机”决定向哪个方向进行舍入,则可能会出现无意识偏见。

  • 交替决胜局: 一种比大多数方法更晦涩的方法是交替进行半圆。

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

如果您想阅读有关这些内容的所有内容(计算机算术以及实现它的硬件电路),一个很好的参考资料(在硬件方面很重要)是

计算机算术算法,第二版,以色列·科伦 (Israel Koren) www.ecs.umass.edu/ece/koren/arith/‎ 马萨诸塞大学 阿默斯特,2010

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对总和为 100% 的一组数字进行四舍五入 的相关文章

  • Fortran 数字格式

    我正在使用英特尔 Visual Fortran 编译器专业版 11 1 当我运行此代码时 program Console1 implicit none real 8 parameter iterations 1000 d0 real 8 p
  • 将双数四舍五入到十分位[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的 float 函数 https stackoverflow com questions 485525 round for float in c 好吧 假设我有电话号码8 47434 我想将其四
  • C#中如何将数字四舍五入到小数点后两位?

    我想使用Math Round功能 以下是一些示例 decimal a 1 994444M Math Round a 2 returns 1 99 decimal b 1 995555M Math Round b 2 returns 2 00
  • NSString 的精确浮点值

    NSString str 37 3336 float f str floatValue f 为 37 3335991 除了我自己四舍五入之外 还有没有办法从 NSString 获取精确的浮点值 Use NSDecimalNumber dec
  • Python 中的舍入是如何工作的?

    我对 Python 中舍入的工作原理有点困惑 有人能解释一下为什么Python会这样吗 Example gt gt gt round 0 05 1 this makes sense 0 1 gt gt gt round 0 15 1 thi
  • 当重复应用于一系列计算时,ROUND_HALF_EVEN 为何以及如何最小化累积误差?

    我听说 ROUND HALF EVEN 是金融数据计算中首选的舍入模式 我很想知道这种舍入模式为何以及如何减少 javadoc BigDecimal 1 4 2 中所述的累积误差 谢谢 院长 From 维基百科 http en wikipe
  • C++ 中的舍入和往返数字

    我有一个类 它在内部将某个定点数表示为 32 位整数 分母有些任意 它既不是 2 的幂也不是 10 的幂 为了与其他应用程序通信 数量在输出时转换为普通的旧双精度 并在输入时转换回来 作为类内的代码 它看起来像 int32 t quanti
  • python设置浮点精度的函数

    我想做一个功能 def accuracy number index 例如 accuracy 2 5e 10 5 将返回 0 accuracy 49 2 将返回 0 accuracy 50 2 将返回 100 所以基本上它会四舍五入到最接近的
  • 为什么 float 类型会将 0.5 舍入为 0?如何避免? [复制]

    这个问题在这里已经有答案了 我有这样的声明 SQL Server 2012 SELECT ROUND CAST 50 9685 as float 3 AS Col1 INTO Test 我想看到结果 50 969 但事实上我看到 50 96
  • 如何在 ruby​​ 中保留我的浮点数

    所以我正在尝试一些代码将数字转换为字符串 但是 我注意到在某些情况下它不会保留最后两位小数 例如 我输入 1 01 和 1 04 进行加法 然后得到 2 04 如果我只输入 1 05 它会保留该数字并准确返回 我明白发生了什么事情正在四舍五
  • 如何在Python 3中用前导零填充字符串[重复]

    这个问题在这里已经有答案了 我正在努力使length 001在Python 3中 但每当我尝试打印它时 它都会截断不带前导零的值 length 1 我该如何阻止这种情况发生而不需要施放length在打印之前将其转换为字符串 利用zfill
  • 在Python中,整数除法中向零舍入的好方法是什么?

    1 2 gives 0 正如它应该 然而 1 2 gives 1 但我希望它向 0 舍入 即我希望 1 2 为 0 无论它是正数还是负数 最好的方法是什么 进行浮点除法 然后转换为 int 不需要额外的模块 Python 3 gt gt g
  • fstcw 汇编操作数类型不匹配

    我正在尝试使用 C 中的内联汇编中指定的舍入模式对输入双精度舍入进行舍入 为此 我需要使用以下命令获取 FPU 控制字fstcw然后更改字中的位 不幸的是我在第一行遇到了错误 double roundD double n RoundingM
  • 将浮点数向下舍入到最接近的整数?

    我想获取一个浮点数并将其向下舍入到最接近的整数 然而 如果它不是一个整体 我always想要向下舍入变量 无论它与下一个整数的接近程度如何 有没有办法做到这一点 int x 转换为整数将截断 朝向 0 0 例如math trunc 对于非负
  • Numpy 数组被舍入?小浮点数的减法

    我将 numpy 数组的元素分配为等于 小 值的 python 浮点类型数字的减法 当我这样做并尝试通过打印到命令行来验证结果时 数组被报告为全零 这是我的代码 import numpy as np np set printoptions
  • 将整数四舍五入到最接近的 10 倍数[重复]

    这个问题在这里已经有答案了 我想弄清楚如何对价格进行四舍五入 双向 例如 Round down 43 becomes 40 143 becomes 140 1433 becomes 1430 Round up 43 becomes 50 1
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • C++ 如何为浮点数设置固定的小数精度

    我有一个返回双精度值的 API 调用 双精度数的小数长度可以从许多小数位到几个小数位不等 这一切都取决于执行器的状态 该双精度代表执行器范围半径上的当前位置 我对如此详细的数字不感兴趣 因为它给系统增加了很多噪音 我一直在使用浮点数来节省空
  • 如何在oracle中使用2位小数进行舍入,如下所示

    您好 我有要求 如果我使用舍入函数 则四舍五入为小数点后两位 它会四舍五入 但如果第三个小数小于 5 则不会四舍五入 我的要求是小数点后第三位和小数第二位应该四舍五入 是否可以 eg 17 813 need to be 17 82 20 1
  • C - 舍入问题 (CS50)

    我已经用谷歌搜索这个好几天了 但我迷路了 因此 在网上进行 CS50 似乎无法处理这种数字的四舍五入 我的程序搞乱了浮点数相乘 例如2 10与像这样的整数100它会输出209 xxxxxxxx 现在就像我说的 我已经阅读了无数关于我应该使用

随机推荐

  • ElasticSearch 聚合可以做 SQL 可以做的事情吗?

    在 Elasticsearch 中 我需要获取从最高到最低出现最频繁的颜色的频率和数量 如果我有这样的数据 id name 1 blue 2 blue 3 green 4 yellow 5 blue 6 yellow 7 purple 8
  • 我可以将服务注入到 Grails 的过滤器中吗?

    我有一项服务可以在会话中获取和设置用户 如果有登录用户 我想将一些用户信息传递给每个视图 并认为过滤器是最好的方法 这样我就不必在每个控制器 操作中重复该信息 当我运行该应用程序时 出现以下错误 Error creating bean wi
  • 如何在所有字段名称中过滤 C# dataGridView?

    I see 在这个视频中 http www youtube com watch v 2h7C IL FB8添加文本框并让它驱动 datagridView 的过滤非常容易 问题在于该视频中 您似乎必须指定要根据哪一列进行过滤 RowFilte
  • 错误:“getGamesClient() 未定义” - 尝试运行 Google 的示例游戏

    我正在尝试运行 Google Game Play Services 示例here https github com playgameservices android samples tree master 8BitArtist 我已按照指示
  • 为温莎城堡中的所有接口实现注册拦截器

    我对温莎城堡相当陌生 特别是使用拦截器 我想知道是否可以在特定接口的所有实现中注册拦截器 而无需依次指定每个实现 例如 我有一个名为IComponent这将由许多班级实施 我有一个ComponentInterceptor编写的类在这些类执行
  • java中线程池的类型[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 java中的线程池有哪几种类型 我需要实现一个强大的多线程应用程序 该应用程序使用大量计算 我应该使用哪个线程池 java中有多种线程
  • 在 Spree (RoR) 中保存产品时,价格会乘以 100

    我在 Rails 3 1 3 和 Ruby 1 9 3 之上安装了在线购物框架 Spree 我还使用 Spree i18n gem 来本地化商店 现在 每当我保存产品时 价格都会乘以 100 例如 在管理区域中 我输入价格 3 20 结果是
  • String.split() *不*用于正则表达式?

    Since String split 使用正则表达式 这个片段 String s str str argh s split r 产量 s t s t a g h 分割这个字符串的最优雅的方法是什么r 序列 以便它产生 st st argh
  • Java EE7 中的多个 Web 套接字端点或单个 Web 套接字端点哪个更好

    Java EE 7 允许您通过注释非常轻松地创建新端点 但是 我想知道使用多个端点来处理每种消息类型是一个好主意 还是应该只使用一个端点外观来处理所有内容 我倾向于拥有一个单一端点外观 其理论基础是每个端点都会创建一个到客户端的新套接字连接
  • 如何在没有通用视图的 post_save_redirect 参数的情况下重定向到 Django 中新创建的对象

    我正在尝试将用户重定向到新创建的对象object get absolute url 保存表格后 我没有使用通用视图 所以我不能使用post save redirect争论 的相关部分view就像这样 if form is valid for
  • MemorySharp 设置地址偏移量不起作用

    好的 我正在使用MemorySharp用于读取 写入游戏内存的库 我的问题是 当我尝试将偏移量添加到基指针地址时 Visual Studio 在运行时会引发错误 这是基本代码 using var m new MemorySharp Appl
  • 无法比较飞行中的 ping 时间

    我尝试以下命令失败 sdiff lt ping www nato int lt ping www reuters com 有什么办法可以实时比较 ping 时间吗 通常我只是并排打开两个 xterm 然后在每个 xterm 中运行 ping
  • 使用可滚动结果集在休眠中批量读取数据

    我正在阅读一篇关于使用休眠进行批量获取的博客http java dzone com articles bulk fetching hibernate http java dzone com articles bulk fetching hi
  • 编译错误:Lambda 目标类型交集类型

    public class X Object o I J gt interface I public void foo interface J public void foo public void bar Oracle 编译器抛出错误 X
  • WCF服务路由,瓶颈?

    我们的应用程序服务器体系结构经过设置 以便每个服务调用都经过自定义构建的 WCF 服务路由器 一个使用请求消息标头中嵌入的信息将传入请求分发到适当服务的服务 我们在使用此 WCF 服务路由器时遇到性能问题 对并发用户进行负载测试时超时 我们
  • WinRT 中的应用程序间通信

    Windows 8 上有两个 WinRT 应用程序 C Xaml 如果有的话 第一个应用程序应该接收一些数据并将其发送到第二个应用程序中 最好的方法是什么 可以使用WCF吗 编辑 第一个应用程序知道第二个应用程序 实际上第二个应用程序是一个
  • 使用 JDBC 进行批量插入的有效方法

    在我的应用程序中 我需要进行大量插入 它是一个 Java 应用程序 我使用普通 JDBC 来执行查询 数据库是Oracle 不过 我启用了批处理 因此它节省了执行查询的网络延迟 但查询作为单独的 INSERT 串行执行 insert int
  • 模拟来自developer.sandbox.com的recurring_ payment_skipped IPN

    当定期付款失败时 我需要模拟 IPN 然后 我的应用程序可以创建待处理发票并将其发送给客户 我搜索并发现我需要设置将在下面处理的 IPNtxn type recurring payment skipped recurring payment
  • 验证货币输入的最佳方法?

    我创建了 TextBox 和 CompareValidator 我认为它们将允许以下形式的输入 5 5 00 5 00 不幸的是 它不允许带有美元符号的版本 如果不允许美元符号 那么对货币进行类型检查有什么意义呢 有没有办法允许这个符号
  • 如何对总和为 100% 的一组数字进行四舍五入

    今天 我的一位朋友向我展示了网站上的一个错误 Link http img594 imageshack us img594 7605 mrul png 您可以看到百分比之和为 100 1 49 20 7 10 9 7 5 5 7 100 1