在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,它给我预期的结果是什么原因?
答案 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!");
这里发生了什么步骤:
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位的数字。这意味着计算的结果是:
这些在传递给parseInt
之前已经过字母化处理:
这些是字符串,而不是数字。 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 的前导部分解释为整数值;它忽略了任何不能被解释为整数表示法的一部分的字符,并且没有任何指示忽略任何这样的字符。
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;