在base10字符串转换时检测JavaScript中的数字溢出
当数字字符串在+/-2^53范围内时,代码的计算结果为在base10字符串转换时检测JavaScript中的数字溢出,javascript,Javascript,当数字字符串在+/-2^53范围内时,代码的计算结果为true,当数字字符串超出该范围时,代码的计算结果为false num_string = "9007199254740992" new_num = (new Number(num_string)+"") num_string === new_num 这似乎有效,但检测数字溢出的正确方法是什么?例如,如果初始字符串具有前导零007,则此操作将失败。这不是溢出,不应该失败 编辑:我必须使用字符串,我正在从字符串转换为数字,我想知道我的数字是否被
true
,当数字字符串超出该范围时,代码的计算结果为false
num_string = "9007199254740992"
new_num = (new Number(num_string)+"")
num_string === new_num
这似乎有效,但检测数字溢出的正确方法是什么?例如,如果初始字符串具有前导零007
,则此操作将失败。这不是溢出,不应该失败
编辑:我必须使用字符串,我正在从字符串转换为数字,我想知道我的数字是否被弄乱了。因此,我正在测试一个字符串(不是数字)。您不需要使用字符串:
9007199254740993 === 9007199254740992 // true
但是,您应该检查Number.MAX\u SAFE\u INTEGER
,它将告诉您可以使用的最高整数,而不会损失精度
Number.MAX_SAFE_INTEGER // 9007199254740991
因此,请检查:
if (num > Number.MAX_SAFE_INTEGER) {
// not safe!
}
您还可以使用函数(贷记到):
@jcalfee314:无论
num
来自何方。关键是要与Number.MAX\u SAFE\u INTEGER
进行比较。你说你自己把字符串转换成一个数字。那么,是什么阻止您进行这种比较呢?对第一个示例不满意,但是对于Number.MAX_SAFE_INTEGER
@jcalfee314:Number.MAX_SAFE_INTEGER
是9007199254740991
<代码>9007199254740992始终大于9007199254740991
。此外,并非每个大于9007199254740991
的数字都会导致9007199254740992
:1234567890123456789018901234567890//12345678901000
。对于支持number.MAX_SAFE_INTEGER
的浏览器,可以使用number.isSafeInteger()
method:@jcalfee314:为什么要再次比较字符串?你必须提供更多的上下文来更好地解释你的情况。否则我认为你把事情弄得更复杂了。通过那次行动你想知道什么?如果您只想知道字符串是否可以转换为数字,那么这个方法就足够了。如果前导零可能是一个问题,请先删除它们(我不知道它们怎么会是一个问题,Number('008')
工作正常并返回8
)。
Number.isSafeInteger(num)