为何JS中parseInt解析31位二进制串返回1,C#中却返回对应整数值
差异原因说明
核心问题是你调用JavaScript的parseInt时传入的第一个参数类型错误,而非两个语言的进制转换逻辑存在差异:
- C#侧的执行逻辑完全符合预期:
Convert.ToInt32(string value, int fromBase)方法第一个参数要求为字符串,你传入的是完整的31位二进制字符串"1000000000000000000000000000000",转换为十进制就是2的30次方,结果1073741824正确。 - JavaScript侧的错误源于参数的隐式转换:
你给parseInt传入的第一个参数是数字字面量1000000000000000000000000000000,而非字符串。JavaScript的数字类型采用IEEE 754双精度浮点数标准,能精确表示的整数最大为2^53(即9007199254740992),你写的这个数字远超该上限,JS解析时就已经丢失精度,会被自动转换为科学计数法表示的1e+30。
而parseInt的规则是如果传入的第一个参数不是字符串,会先将其转换为字符串再处理:1e+30转为字符串后是"1e+30",parseInt解析该字符串时遇到非数字字符e就会终止解析,仅保留开头的1,再按2进制转换为十进制后结果就是1。
如果要在JavaScript中得到和C#一致的结果,只要将第一个参数改为字符串传入即可:
parseInt("1000000000000000000000000000000", 2)
执行后返回结果就是正确的1073741824。
内容的提问来源于stack exchange,提问作者Imran Qadir Baksh - Baloch
相关产品推荐
相关产品推荐

