将字符串转换为数字

时间:2017-05-16 14:36:00

标签: javascript numbers parseint type-conversion

this example on parseInt method

中的MDN中



console.log(parseInt(4.7 * 1e22, 10)); // Very large number becomes 4
console.log(parseInt(4.7 * 1e20, 10)); //result is 470000000000000000000




或小于20,它给我预期的结果是什么原因?

2 个答案:

答案 0 :(得分:3)

在@Xufox的帮助下

int[] input =  ..... // your array

// create an IntStream with the values of the input array at the even indices ...
// ... then get the unique elements and count how many you have
long countEven = IntStream.range(0, input.length)
                    .filter(n -> n % 2 == 0).map(i -> input[i]).distinct().count();
// do the same for the uneven indices
long countUneven = IntStream.range(0, input.length)
                    .filter(n -> n % 2 != 0).map(i -> input[i]).distinct().count();
// if the even/uneven indices contain 1 unique element each, 
// ... the array contains alternating numbers
if (countEven == 1L && countUneven == 1L) System.out.println("alternating 1s and 0s!");

这里发生了什么步骤:

  • 完成计算(4.7 * 1e20)和(4.7 * 1e22)
  • JavaScript引擎的计算结果为console.log(parseInt(4.7 * 1e22, 10)); // Very large number becomes 4 console.log(parseInt(4.7 * 1e20, 10)); //result is 470000000000000000000 ,因此可以传递给stringified
  • 将字符串解析为数字
  • 最后记录了

JavaScript使用科学记数法截断每个数字超过20位的数字。这意味着计算的结果是:

  • 470000000000000000000
  • 4.7e22

这些在传递给parseInt之前已经过字母化处理:

  • “470000000000000000000”
  • “4.7e22”

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

答案 1 :(得分:1)

在基数为10的20位整数后失败。

您可以查看parseInt的说明:

  

由于某些数字在其字符串表示中包含e字符(例如 6.022e23 ),因此使用parseInt截断数值会在非常大或非常小的数字上使用时产生意外结果。不应将parseInt替换为Math.floor()

从标准ECMA 252 V 5.1 15.1.2.2 parseInt (string , radix)

第13步:

  

mathInt 是用 Z 表示的数学整数值,用radix- R 表示法,使用字母 AZ < / strong>和 az 表示值为10到35的数字。(但是,如果 R 为10且 Z 包含超过20位有效数字,根据实施的选择,20号之后的每个有效数字可以被 0 数字替换;如果 R 不是2,4,8,10,16,或32,那么 mathInt 可能是数学整数值的依赖于实现的近似值,由 Z 以radix- R 表示法表示。)

     

...

     

请注意

     

parseInt可能只将 string 的前导部分解释为整数值;它忽略了任何不能被解释为整数表示法的一部分的字符,并且没有任何指示忽略任何这样的字符。

&#13;
&#13;
var x = 5.7 * 1e20;
console.log(x);
console.log(parseInt(x, 10));

x = 5.7 * 1e21;
console.log(x);
console.log(parseInt(x, 10));
&#13;
&#13;
&#13;