为什么 JavaScript 中带小数的最大位数只有 16

2023-12-20

不久前我在测试一些 HTML 表单时遇到了这个问题。 JavaScript 中带小数点的数字的最大位数仅为 16

我尝试过以下方法

var x = 12345678912345.6789

x 是 12345678912345.68 -仅 16 位数字

var x = 123456789123.6789

x 是 123456789123.6789 -仅 16 位数字

new Number(12345678912345.6789)

12345678912345.68 -仅 16 位数字

new Number(123456789123.6789)

123456789123.6789 -仅 16 位数字

如果计算总位数,则为 16。如果增加小数点前的位数,则小数点后的位数会四舍五入

相似地

new Number(.12345678912367890)

是 0.1234567891236789 -仅 16 位数字(注意尾随 0 丢失)

这让我推断出带有小数的数字只能有 16 位数字。如果我尝试添加更多数字,数字就会开始四舍五入

我还观察到,当我在 ASP.NET MVC 中将带有小数的数字序列化为 JSoN 时,它还会将该数字转换为最大 16 位数字并对其余数字进行四舍五入

我的问题:为什么?


根据 JS/ECMAScript 规范,Number type https://tc39.github.io/ecma262/#sec-ecmascript-language-types-number-type使用具有 64 位格式的双精度浮点(binary64),由一个符号位(决定正值或负值)、11个指数位和52个小数位(每个数字代表4位,因此64位有16位)组成:

Number 类型代表双精度 64 位格式 IEEE 754-2008 值按照 IEEE 二进制标准中的规定 浮点运算。

使用双精度可以正确表示的最大正数是9007199254740992,这可以通过使用来实现Math.pow(2, 53)。如果数字范围介于Math.pow(2, 53) and Math.pow(2, 54)(或之间Math.pow(2, -53) and Math.pow(2, -54)),只有偶数才能正确表示,因为指数位会影响小数位上的 LSB(最低有效位)。

让我们回顾一下大数部分:

var x = 12345678912345.6789

var x = new Number(12345678912345.6789)

该数字包含超过 52 个小数位(总共 72 位),因此进行舍入以将小数位保持为 52。

还有这个十进制数:

var x = new Number(.12345678912367890)

该数字包含 68 个小数位,因此最后一个零被截掉以保持 64 位长度。

通常数字表示大于9007199254740992或小于1.1102230246251565E-16存储为文字字符串而不是Number。如果您需要计算非常大的数字,可以使用某些外部库来执行任意精度算术。

进一步阅读:

ECMAScript:数字编码 http://2ality.com/2012/04/number-encoding.html

ECMAScript:处理大整数 http://2ality.com/2012/07/large-integers.html

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

为什么 JavaScript 中带小数的最大位数只有 16 的相关文章

随机推荐

  • 带有 mysql 驱动程序的 maven tomcat 插件位于 $catalina_home/lib

    我正在尝试在 tomcat 中使用容器管理的数据源 通过 context xml 对应的jar文件需要放到 catalina home lib中 否则tomcat找不到 不在webapp WEB INF lib中 因为它是由web服务器管理
  • 向下滚动页面当前视口的高度

    我有一个页面 其中有一个固定定位的按钮 单击该按钮时应计算视口的高度 然后将页面向下滚动该高度 IE 到下一个视口 当用户达到没有更多空间滚动的程度时 我想隐藏此按钮 不知道该怎么做 到目前为止我有这个 document on click
  • 将字符串从 Android 手机发送到 PC [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我怎样才能发送一个字符串 例如 hi 从我的 Android 手机传输到我的电脑 在 Android 中执行此操作之前 我建议您阅读
  • 如何通过单击一次在 jsFiddle 上的 jQuery 中获得简单的 ZeroClipboard 复制到剪贴板设置?

    我正在努力让 ZeroClipboard 在 jQuery 上下文中工作 我所追求的基本用法是剪切每个的文本div与班级copy单击时 以下 jsFiddle 使用稳定的 ZeroClipboard v1 3 3 进行双击工作 http j
  • 粘贴文本的 Emacs 编码

    我 偶尔 在 Windows 8 上使用 emacs24 3 当我遇到编码问题时粘贴文本 非 ASCII 字符被替换为它们的 uucode 我的 emacs 编码默认是 utf 8 我试图快速浏览一下 apropos 帮助 但没有任何内容与
  • 程序员什么时候使用空基优化(EBO)

    我正在阅读有关空基优化 EBO 的内容 阅读过程中 我的脑海中浮现出以下问题 使用空类作为基类有什么意义它对派生类没有任何贡献 无论是功能方面还是数据方面 In 我读到了这个 S为空类结构 T S 整数x 请注意 我们没有丢失任何数据或 代
  • 数据绑定中的 Html.fromHtml - Android

    我正在使用来自dataBinding在我的项目中 当我有以下情况时xml干得好
  • 如何在 MATLAB 中将 3 列矩阵绘制为颜色图?

    我有一个矩阵 其中包含一组 GPS 坐标的温度值 所以我的矩阵看起来像这样 Longitude Latitude Value 12 345678 23 456789 25 12 345679 23 456790 26 should be x
  • 使用具有命名范围的数组加速 VBA

    我有一个电子表格 我已经花了一个多月的时间来排序和优化坐标 有时超过 100 000 行 它是难以忍受一旦我开始导入超过 5 000 行的文件 速度就会变慢 需要几个小时才能完成超过 25 000 行的数据集的计算和排序过程 处理时间随着导
  • 如何在生产中防止 Ocp-Apim-Trace: true 和 ocp-apim-trace-location ?

    我了解当请求包括Ocp Apim Trace true像下面这样 GET api v1 BotConfig HTTP 1 1 Host xyz azure api net Cache Control no cache Ocp Apim Tr
  • 在 Windows 7 上使用 PhoneGap 创建 iPhone 应用程序

    C soft my app gt phonegap create something phonegap create called with the options C soft my app something com phonegap
  • 更改 Eclipse 3.5 中的用户代理以安装新软件

    如何在 Eclipse 3 5 中更改用户代理 我尝试添加属性 Dhttp agent 我的用户代理到 eclipse ini 文件 但使用 WireShark 我可以看到用户代理仍然雅加达 Commons HttpClient 3 1 我
  • 将 Scala Stream 转换为新 Stream,它是当前元素与前一个元素的总和

    如何转换整数的 Scala Stream 以便我们拥有一个新的 Stream 其中元素是该元素与前一个元素的总和 例如 如果输入流是 1 2 3 4 则输出流是 1 3 5 7 还有第二个问题 如何使总和使用输出流中的前一个 以便输出为 1
  • Python 多处理应用程序陷入 docker 容器中

    我正在尝试运行一个多处理 Python 应用程序来加速和并行我的任务 我的应用程序使用简单的多处理Pool并在资源有限的 docker 容器中运行 我注意到我的应用程序有时会卡住 它永远不会结束 终止 但没有任何移动 任务停止运行 没有日志
  • JSON解析swift,数组在NSURLSession之外没有值

    我正在尝试使用以下代码快速调用 json webservice 并将其显示在tableview在快速的IOS中 declared as global var IdDEc String string array declared global
  • TinyMCE UTF-8 保存到 MySQL 数据库

    我将 TinyMCE 输入发送到 POST 一个 php 文件 然后将其保存在 MySQL 数据库中 输入具有 UTF 8 土耳其字符 所以当我输入时T rk e在 TinyMCE 输入中并将其发送到 post PHP 后端收到此字符串 p
  • 枚举是否应该具有未初始化的值。

    我们正在争论枚举是否应该具有未初始化的值 例如 我们有 public enum TimeOfDayType Morning Afternoon Evening or public enum TimeOfDayType None Mornin
  • Logstash 文件输入插件

    目前 我正在使用文件输入插件来检查我的日志存档 但文件输入插件对我来说不是正确的解决方案 因为文件输入插件本质上期望该文件是事件流而不是静态文件 现在 这给我带来了很大的问题 因为我的日志存档有 100 000 多个日志文件 而我的 Log
  • 查找访问令牌的过期时间

    有什么方法可以使用图形 api 来查明页面访问令牌或应用程序令牌何时过期 Update 有一个新的 API 端点用于访问有关访问令牌的信息 您可以在这里找到信息 调试访问令牌和处理错误 https developers facebook c
  • 为什么 JavaScript 中带小数的最大位数只有 16

    不久前我在测试一些 HTML 表单时遇到了这个问题 JavaScript 中带小数点的数字的最大位数仅为 16 我尝试过以下方法 var x 12345678912345 6789 x 是 12345678912345 68 仅 16 位数