Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.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中出现意外输出_Javascript_Numbers_Parseint_Type Conversion - Fatal编程技术网

将字符串转换为数字时javascript中出现意外输出

将字符串转换为数字时javascript中出现意外输出,javascript,numbers,parseint,type-conversion,Javascript,Numbers,Parseint,Type Conversion,在MDN中 console.log(parseInt(4.7*1e22,10));//非常大的数字变成4 console.log(parseInt(4.7*1e20,10))//结果是470000000000000000000它在基数为10的20位整数之后失败 您可以查看以下内容的描述: 由于某些数字在其字符串表示形式中包含e字符(例如,6.022e23),因此在非常大或非常小的数字上使用parseInt截断数值时会产生意外的结果parseInt不应用作的替代 来自标准ECMA 252 V 5

在MDN中

console.log(parseInt(4.7*1e22,10));//非常大的数字变成4

console.log(parseInt(4.7*1e20,10))//结果是470000000000000000000
它在基数为10的20位整数之后失败

您可以查看以下内容的描述:

由于某些数字在其字符串表示形式中包含e字符(例如,
6.022e23
),因此在非常大或非常小的数字上使用parseInt截断数值时会产生意外的结果<代码>parseInt不应用作的替代

来自标准ECMA 252 V 5.1

步骤13:

设mathInt为数学整数值,以基数-R表示法由Z表示,对于值为10到35的数字,使用字母A-ZA-Z。(但是,如果R为10且Z包含超过20个有效数字,则20后的每个有效数字可由实现选项替换为0数字;如果R不是2、4、8、10、16或32,则mathInt可能是表示为b的数学整数值的依赖于实现的近似值。)y Z以基数-R表示。)

parseInt
只能将字符串的前导部分解释为整数值;它忽略任何不能解释为整数表示法一部分的字符,并且没有给出忽略任何此类字符的指示

var x=5.7*1e20;
控制台日志(x);
log(parseInt(x,10));
x=5.7*1e21;
控制台日志(x);
log(parseInt(x,10))来自@Xufox的帮助

console.log(parseInt(4.7 * 1e22, 10)); // Very large number becomes 4
console.log(parseInt(4.7 * 1e20, 10)); //result is 470000000000000000000
这里发生的事情分步骤进行:

  • 计算完成(4.7*1e20)和(4.7*1e22)
  • 计算结果由JavaScript引擎字符串化,因此可以将其传递到
    parseInt
  • 字符串被解析回一个数字
  • 最后它被记录下来了
JavaScript使用科学符号截断每个超过20位的数字。这意味着计算结果为:

  • 470000000000000000000000000
  • 4.7e22
在传递给
parseInt
之前,这些字符串将被字符串化:

  • “470000000000000000000”
  • “4.7e22”

这些是字符串,不是数字
parseInt
现在将忽略第二个值中点之后的所有内容,并返回
4

4.7*1e22
已经是一个整数。为什么要再次将其解析为整数
parseInt
将第一个参数转换为字符串(因为它需要一个),并再次将其解析为整数。
4.7*1e22
的实际结果是
4.7e+22
。预期结果是什么?好的,我知道了,但在转换4.7e+22时也存在冲突,为什么这会给出4,而4.7e+2会给出问题的答案,“为什么一些值可以准确地表示,而另一些值可以更大的数字表示,这是因为变量存储在内存中的分配方式不同。正如这里所讨论的,javascript中的数字类型可以存储一个最大值。这是一个评论,而不是一个答案,因为第二行给出的数字实际上比这还要大,我不知道为什么。我也很想听到答案。我的预期结果是47000000000000000,而不仅仅是4