Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript中带小数的最大数字只有16_Javascript_Asp.net Mvc_Json.net_Precision - Fatal编程技术网

为什么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

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

我试过以下方法

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个点,可以:

  • 使用文字字符串表示您的数字
  • 使用外部库,如或

根据JS/ECMAScript规范,使用双精度浮点,其具有64位格式(
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)