Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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 使用表示大于Number.MAX\u SAFE\u INTEGER的值的字符串调用parseInt_Javascript_Integer - Fatal编程技术网

Javascript 使用表示大于Number.MAX\u SAFE\u INTEGER的值的字符串调用parseInt

Javascript 使用表示大于Number.MAX\u SAFE\u INTEGER的值的字符串调用parseInt,javascript,integer,Javascript,Integer,我想问一下,当使用表示大于Number.MAX\u SAFE\u integer的整数值的字符串调用时,parseInt的行为 从技术上讲,我假设我应该期望通过直接使用该值(即作为数字而不是字符串)得到相同的结果 例如,以下两个将产生相同的值(无论其是否准确): const x=parseInt(“0x1000000000000000000”) const x=0x1000000000000 然而,我明白,也许JS不能保证这一点 所以我想知道的是,我是否至少可以指望parseInt返回一个不

我想问一下,当使用表示大于
Number.MAX\u SAFE\u integer
的整数值的字符串调用时,
parseInt
的行为

从技术上讲,我假设我应该期望通过直接使用该值(即作为数字而不是字符串)得到相同的结果

例如,以下两个将产生相同的值(无论其是否准确):

  • const x=parseInt(“0x1000000000000000000”)
  • const x=0x1000000000000
然而,我明白,也许JS不能保证这一点


所以我想知道的是,我是否至少可以指望
parseInt
返回一个不同于0的值,当使用表示大于
Number.MAX\u SAFE\u integer

的整数值的字符串调用时,数字表示的基本问题是-任何超过
Number的数值。MAX\u SAFE\u integer
不再安全使用。基本示例:

const max=Number.max\u SAFE\u整数;
常量maxPlus1=Number.MAX\u SAFE\u整数+1;
const maxPlus2=Number.MAX\u SAFE\u整数+2;
console.log(“max:”,max)//9007199254740991
console.log(“max+1:”,maxPlus1)//9007199254740992
console.log(“max+2:”,maxPlus2)//9007199254740992

log(“max+1=max+2:,maxPlus1==maxPlus2”)//正确
数字表示法的基本问题是任何超过
数字的数字。MAX_SAFE_INTEGER
不再安全使用。基本示例:

const max=Number.max\u SAFE\u整数;
常量maxPlus1=Number.MAX\u SAFE\u整数+1;
const maxPlus2=Number.MAX\u SAFE\u整数+2;
console.log(“max:”,max)//9007199254740991
console.log(“max+1:”,maxPlus1)//9007199254740992
console.log(“max+2:”,maxPlus2)//9007199254740992

log(“max+1=max+2:,maxPlus1==maxPlus2”)//true
它将与MAX_SAFE_INTEGER上的任何其他数字具有完全相同的问题,因此它可能有效或无效。@VLAZ:谢谢。因此,可能存在一个非常大的整数,当使用它时(作为本机
数字或作为传递给
parseInt
的字符串),它将“环绕”为零?它不会环绕,但不精确。如果数字很大,您可能会出现
2+2=5
或其他奇怪的行为。最终,根本不足以表示数字的是底层二进制数字。@VLAZ:是的,但我们不保证这些二进制数字中至少有一个不同于0吗(关于我的底线问题)?另外,请注意,我不是在问不精确的问题。我已经意识到了这个问题(我想这一点很清楚,因为我在问题中明确提到了
MAX\u SAFE\u INTEGER
)。你可以将浮点表示法视为科学符号,例如,
1.2e24
——保留前面和最后的数字(有效和指数)如果指数太高,则指数会有更多的位数
1.2e48
,这将是一个更高的数字,但您仍然使用相同的位数来表示它。因此,如果你“太高”,你仍然会得到一个接近的数字,但你无法计算出实际的数字-
1.001e3
将转换为
1001
,但是如果你截断为,一个小数
1.0e3
将被理解为1000,而您失去了最后一个数字。它将与超过最大安全整数的任何其他数字有完全相同的问题,因此它可能有效或无效。@VLAZ:谢谢。因此,可能存在一个非常大的整数,当使用它时(作为本机
数字或作为传递给
parseInt
的字符串),它将“环绕”为零?它不会环绕,但不精确。如果数字很大,您可能会出现
2+2=5
或其他奇怪的行为。最终,根本不足以表示数字的是底层二进制数字。@VLAZ:是的,但我们不保证这些二进制数字中至少有一个不同于0吗(关于我的底线问题)?另外,请注意,我不是在问不精确的问题。我已经意识到了这个问题(我想这一点很清楚,因为我在问题中明确提到了
MAX\u SAFE\u INTEGER
)。你可以将浮点表示法视为科学符号,例如,
1.2e24
——保留前面和最后的数字(有效和指数)如果指数太高,则指数会有更多的位数
1.2e48
,这将是一个更高的数字,但您仍然使用相同的位数来表示它。因此,如果你“太高”,你仍然会得到一个接近的数字,但你无法计算出实际的数字-
1.001e3
将被转换成
1001
,但是如果你截断到,比如说,一个十进制
1.0e3
将被理解为1000,你失去了最后一个数字。谢谢。你的回答很好,但正如我所说,我的问题不是关于不精确性,因为我很清楚这个问题。我想知道:1。我是否可以指望
praseInt(str)
返回与直接使用
str
作为本机数字得到的值完全相同的值。2.我是否至少可以指望它返回一个不同于0的值。因此,您能否保证,对于表示2^53和(大致)10^309之间的整数的每个字符串,
praseInt
将返回一个非零值?@goodvibration是的,我可以。没有“包”,如“代码> int <代码>字段,例如C++或java,它们是有界整数。我已经(简要地)解释了浮点运算的原理——如果您表示的数字高于允许您失去精度的精度,则不会得到完全不同的数字。精度损失意味着你得到了一个值相似的数字,