gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:59 25 4
gpt4 key购买 nike

不久前我在测试一些 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 使用 double 浮点,具有 64 位格式(binary64),由符号位(确定正值或负值)、11 个指数组成位和 52 个小数位(每个数字代表 4 位,因此 64 位有 16 位):

The Number type representing the double-precision 64-bit format IEEE 754-2008 values as specified in the IEEE Standard for Binary Floating-Point Arithmetic.

使用 double 可以正确表示的最大正数为 9007199254740992,这可以通过使用 Math.pow(2, 53) 来实现。如果数字范围在 Math.pow(2, 53)Math.pow(2, 54) 之间(或在 Math.pow(2, - 53)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: Number Encoding

ECMAScript: Working with large integers

关于javascript - 为什么 JavaScript 中带小数的最大位数只有 16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59954918/

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