为什么更改总和顺序会返回不同的结果?

2023-11-27

为什么更改总和顺序会返回不同的结果?

23.53 + 5.88 + 17.64 = 47.05

23.53 + 17.64 + 5.88 = 47.050000000000004

Both Java and JavaScript返回相同的结果。

据我了解,由于浮点数以二进制表示的方式,一些有理数(比如 1/3 - 0.333333...) 无法精确表示。

为什么仅仅改变元素的顺序就会影响结果?


也许这个问题很愚蠢,但是为什么简单地改变元素的顺序就会影响结果呢?

它将根据值的大小更改值的舍入点。作为一个例子kind对于我们所看到的事情,让我们假设我们使用的是具有 4 个有效数字的十进制浮点类型,而不是二进制浮点,其中每次加法都以“无限”精度执行,然后四舍五入到最接近的可表示数字。这里有两个总和:

1/3 + 2/3 + 2/3 = (0.3333 + 0.6667) + 0.6667
                = 1.000 + 0.6667 (no rounding needed!)
                = 1.667 (where 1.6667 is rounded to 1.667)

2/3 + 2/3 + 1/3 = (0.6667 + 0.6667) + 0.3333
                = 1.333 + 0.3333 (where 1.3334 is rounded to 1.333)
                = 1.666 (where 1.6663 is rounded to 1.666)

我们甚至不需要非整数来解决这个问题:

10000 + 1 - 10000 = (10000 + 1) - 10000
                  = 10000 - 10000 (where 10001 is rounded to 10000)
                  = 0

10000 - 10000 + 1 = (10000 - 10000) + 1
                  = 0 + 1
                  = 1

这可能更清楚地表明,重要的是我们的数量有限。有效数字- 数量不限小数位。如果我们能够始终保持相同的小数位数,那么至少通过加法和减法,我们就可以了(只要值不溢出)。问题是,当您获得更大的数字时,会丢失更小的信息 - 在本例中 10001 被四舍五入为 10000。 (这是一个问题的例子埃里克·利珀特在他的回答中指出.)

重要的是要注意,右侧第一行的值在所有情况下都是相同的 - 因此,尽管重要的是要了解您的十进制数字(23.53、5.88、17.64)不会完全表示为double值,这只是一个问题,因为上面显示的问题。

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

为什么更改总和顺序会返回不同的结果? 的相关文章

随机推荐

  • 如何更改内核 I/O 缓冲区大小

    我正在对 I O 密集型应用程序进行一些实验 并试图了解改变内核 I O 缓冲区大小 不同电梯算法等的影响 如何知道内核中 i o 缓冲区的当前大小 内核是否根据需要使用多个缓冲区 我怎样才能改变这个缓冲区的大小 是否有一个配置文件存储此信
  • Oracle 10g 中通过数据库链接的传输是否经过压缩?是否可以?

    我正在通过数据库链接将数据从一个基地传输到另一个基地 使用INSERT INTO SELECT 我想知道通过链接传输的数据是否经过压缩或者可以压缩以避免过多的网络使用 我的带宽非常少 我认为如果还没有完成的话会有所帮助 有一些重复数据删除但
  • 每行带有 ^M 的文本文件

    我刚刚从朋友那里得到了一个源代码文件 该文件是在 UNIX 中创建的 当我使用 NotePad 在 Windows 中打开它时 每一行都有一个额外的空行 带着疑惑 我下载了 Vim 并用它打开了该文件 然后我在每行末尾看到一堆 M 这是什么
  • TFS 2010:如何将工作项链接到变更集

    我想以编程方式将工作项链接到变更集 目前 我已经从我的 C 代码创建工作项并将它们保存到 TFS 代码如下 WorkItem item new WorkItem project WorkItemTypes CustomItem item F
  • 使用system()执行命令时如何设置环境变量?

    我正在 Linux 上编写 C 程序 需要执行命令system 并且在执行该命令时需要设置环境变量 但我不知道在使用时如何设置环境变量system 如果要将与父进程不同的环境变量传递给子进程 可以使用以下组合getenv and seten
  • 获取所有程序的、用户定义的函数

    如何通过以下方式获取所有用户定义函数的列表SQL query 我找到这段代码here SELECT p proname p pronargs t typname FROM pg proc p pg language l pg type t
  • 在 iPad 上使用 Swift UI 禁用分割视图

    有没有办法在 iPad 上的导航视图中使用 SwiftUI 禁用 SplitView 通过设置NavigationViewStyle import SwiftUI struct NavView View var body some View
  • 使用标记模板文字传递更多参数

    我正在与样式组件并使用其标记模板文字语法生成组件 例如 const Button styled button background color papayawhip border radius 3px color palevioletred
  • 遍历 DOM 树

    由于大多数 全部 执行 HTML 清理的 PHP 库 例如 HTML Purifier 严重依赖于正则表达式 因此我认为尝试编写一个使用 DOMDocument 和相关类的 HTML 清理程序将是一个值得尝试的实验 虽然我还处于这个项目的早
  • 使用 GCDAsyncSocket 通过套接字进行 Telnet

    我正在尝试从目标 c 通过 telnet 连接到 Cisco C40 编解码器 在我的计算机上使用终端时 我得到 密码 然而 在进行套接字连接时 需要进行 telnet 协商 我就是这样 但由于某种原因我无法到达上面的 密码 提示 void
  • MySQL会自动优化子查询吗?

    我想运行以下查询 Main Query SELECT COUNT FROM table name WHERE device id IN SELECT DISTINCT device id FROM table name WHERE NAME
  • 覆盖默认的 Android 主题

    我已经能够覆盖任何名称前面带有 android 的主题 但 Android theme xml 还定义了似乎无法覆盖的属性 例如
  • 成员名称不能与分部类的封闭类型相同

    我定义了一个具有如下属性的分部类 public partial class Item public string this string key get if Fields null return null if Fields Contai
  • 在 sagemaker 中进行预测之前如何预处理输入数据?

    我正在使用 java Sagemaker SDK 调用 Sagemaker 端点 我发送的数据在模型可以使用它进行预测之前几乎不需要清理 我怎样才能在 Sagemaker 中做到这一点 我在 Jupyter 笔记本实例中有一个预处理功能 它
  • 相邻兄弟姐妹的边际崩溃

    我正在阅读有关保证金崩溃的文章 我发现了这一点 margin 相邻兄弟姐妹 相邻兄弟姐妹的边距折叠 除非后一个兄弟需要清除过去的浮动 我不明白最后一句话 除非后一个兄弟需要清除过去的浮动 有人可以举个例子吗 谢谢 首先 下面的示例仅适用于基
  • 输出两个单词之间的文本

    我想使用 PHP 输入某个文本 输出应该是两个单词之间的文本 澄清 Input Lorem ipsum dolor sit amet Output dolor sit str Lorem ipsum dolor sit amet word1
  • 调用仅在运行时已知的函数

    我想通过输入验证服务器来首次尝试 Rust 应用程序 该服务器可以验证 AJAX 请求中的值 这意味着我需要一种方法来使用 JSON 配置文件来根据输入值的名称以及可能在运行时在 HTTP 请求中传入的表单名称来指定使用哪些验证函数 我怎样
  • 无法在 Chrome 扩展程序中使用 jQuery 触发点击

    我试图用一行 jQuery 代码创建一个 Chrome 扩展 但它不起作用 我正在尝试触发对某个元素的点击 chrome的控制台根本没有显示任何错误 当我只将 jQuery 代码放入控制台时 它工作正常 My code 内容 js docu
  • Hibernate 5 更改为不使用仅获取第一行

    我正在使用带有 oracle 11 的 Hibernate 5 2 它不支持仅获取第一行 我需要回到旧样式的 hibernate 有没有休眠配置可以做到这一点 您可以强制 Hibernate 使用 Oracle 10g 方言 这样您将使用
  • 为什么更改总和顺序会返回不同的结果?

    为什么更改总和顺序会返回不同的结果 23 53 5 88 17 64 47 05 23 53 17 64 5 88 47 050000000000004 Both Java and JavaScript返回相同的结果 据我了解 由于浮点数以