为什么JavaScript中带小数的最大数字只有16
我在测试一些HTML表单时遇到了这个问题。JavaScript数字中带小数点的最大位数仅为16 我试过以下方法为什么JavaScript中带小数的最大数字只有16,javascript,asp.net-mvc,json.net,precision,Javascript,Asp.net Mvc,Json.net,Precision,我在测试一些HTML表单时遇到了这个问题。JavaScript数字中带小数点的最大位数仅为16 我试过以下方法 var x = 12345678912345.6789 x是12345678912345.68-仅16位数字 x是123456789123.6789-仅16位数字 12345678912345.68-仅限16位数字 123456789123.6789-仅限16位数字 如果你计算总数,它们是16位。如果增加小数点前的位数,小数点后的位数将四舍五入 同样地 new Number(.123
var x = 12345678912345.6789
x是12345678912345.68-仅16位数字
x是123456789123.6789-仅16位数字
12345678912345.68-仅限16位数字
123456789123.6789-仅限16位数字
如果你计算总数,它们是16位。如果增加小数点前的位数,小数点后的位数将四舍五入
同样地
new Number(.12345678912367890)
仅为0.123456789236789-16位数字(请注意,尾随0缺失)
这让我推断出一个数字中只有16位是十进制的。如果我尝试添加更多的数字,数字就会开始四舍五入
我还注意到,当我在ASP.NET MVC中将一个带十进制的数字序列化为JSoN时,它还将该数字转换为最多16位数字,并对其余数字进行四舍五入
我的问题:为什么?在javascript中,不能用二进制浮点类型(ECMAScript使用二进制浮点类型来表示浮点值)精确地表示大多数小数 这就是javascript在小数点后使用16个数字的原因。 比如说- 尝试运行:
var x = 3.14159265358979323846;
print(x.toFixed(20));
并查看以下正在被转换为浮动的内容
如果要在小数点后投射超过16个点,可以:
- 使用文字字符串表示您的数字
- 使用外部库,如或
binary64
),由符号位(确定正值或负值)、11个指数位和52个分数位(每个数字表示4位,因此64位有16位):
表示双精度64位格式IEEE的数字类型
754-2008值如IEEE二进制文件标准中规定
浮点运算
使用双精度可以正确表示的最大正数是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
的数字表示形式存储为文字字符串,而不是数字
。如果需要计算非常大的数字,可以使用某些外部库来执行任意精度的算术
进一步阅读:
因为此数字类型的精度为16位?还要注意,您使用的数字类型可能也不精确,这意味着它使用某种浮点实现。JS
number
使用双精度浮点,它遵循IEEE 754(请参阅),具有64位精度(16位)的限制。这就是为什么有些数字在超过16位时会被舍入。@TetsuyaYamamoto感谢您的评论。它帮助我清楚地理解事物。你介意把这个作为答案,这样我就可以把它标记为正确的吗?
var x = 3.14159265358979323846;
print(x.toFixed(20));
var x = 12345678912345.6789
var x = new Number(12345678912345.6789)
var x = new Number(.12345678912367890)