外行人对 JavaScript 为什么有奇怪的浮动数学的解释 – IEEE 754 标准 [重复]

2024-01-27

当我对浮点数进行数学运算时,我永远无法准确理解 JavaScript 到底发生了什么。我一直非常害怕使用小数,以至于我尽可能避免使用它们。然而,如果我知道 IEEE 754 标准的幕后发生了什么,那么我就能够预测会发生什么;有了可预测性,我就会更加自信,不再那么恐惧。

有人可以给我一个简单的解释吗(就像解释整数的二进制表示一样简单关于 IEEE 754 标准如何工作以及它如何产生这种副作用:0.1 + 0.2 != 0.3?

非常感谢! :)


像 0.1 这样的小数分数不能用 2 为基数清晰地表达

假设我们想以 2 为基数表示小数 0.1。我们知道它等于1/10。以 2 为底数的 1 除以 10 的结果是0.000110011001100...具有重复的小数序列​​。

因此,虽然在十进制形式中,实际上很容易清晰地表示像 0.1 这样的数字,但在以 2 为基数的情况下,您无法精确地表示基于 10 的有理数。您只能使用能够存储的尽可能多的位来近似它。

为简化起见,假设我们只有足够的存储空间来重现该数字的前 8 个有效二进制数字。存储的数字为 11001100(以及 11 的指数)。这会转换回以 2 为基数的 0.000110011,十进制表示为 0.099609375,而不是 0.1。这是如果将 0.1 转换为以 8 位存储基值(不包括符号位)的理论浮点变量时会发生的错误量。

浮点变量如何存储值

IEEE 754 标准指定了一种用符号和二进制指数对实数进行二进制编码的方法。指数应用在binary域,这意味着在转换为二进制之前不要移动小数点,而是在转换之后进行。

IEEE 浮点数有不同的大小,每一种都指定有多少个二进制数字用于基数以及多少个二进制数字用于指数。

当你看到0.1 + 0.2 != 0.3,这是因为您实际上并不是在 0.1 或 0.2 上执行计算,而是仅在浮点二进制中对这些数字的近似值执行一定精度的计算。由于此错误,将结果转换回十进制后,结果将不完全是 0.3。此外,结果甚至不等于二进制近似值 0.3。实际误差量将取决于浮点值的大小,以及使用的精度位数。

舍入有时有帮助,但在这种情况下没有帮助

在某些情况下,由于转换为二进制时的精度损失而导致的计算错误足够小,可以在再次从二进制转换回值时对值进行四舍五入,因此您永远不会注意到任何差异 - 它看起来像这样工作了。

IEEE 浮点对于如何进行舍入有特定的规则。

然而,对于 0.1 + 0.2 与 0.3,舍入并不能消除误差。0.1 和 0.2 的二进制近似值相加的结果将与 0.3 的二进制近似值不同。

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

外行人对 JavaScript 为什么有奇怪的浮动数学的解释 – IEEE 754 标准 [重复] 的相关文章

  • 从 thymeleaf 获取数据到模态引导程序、jquery

    我正在尝试获取模态视图的 id 这是为了更新 onclick 元素 但我找不到方法 知道如何为 boostrap 5 完成此操作 或我可以用其他方法吗 谢谢 tr a inactivate a div class modal fade mo
  • 将 OoXml 插入单词抛出错误:未知

    我一直在尝试通过office js将OOXML插入到word文档的正文内容中insertOoXML 方法 我什至尝试过最简单的实现 认为我在尝试替换 XML 本身中的 fieldCodes 时做了一些不正确的事情 所有结果都是这样Error
  • JavaScript onTouch 不工作

    谁能告诉我为什么这个 onTouch 处理程序没有触发 var myDiv document getElementById existingContent var myButton a href log out a myDiv append
  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • 如何测试 javascript 闭包内的函数

    这似乎是不可能的 也可能是 但我正在尝试更多的 TDD 但我总是在闭包方面碰壁 假设我有以下内容 function createSomething init function privateMethod param return init
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比

随机推荐