Converting hex strings to decimal format: Why am I getting different results in JavaScript and Python?

huangapple go评论71阅读模式
英文:

Converting hex strings to decimal format: Why am I getting different results in JavaScript and Python?

问题

在JavaScript中,可以使用以下代码将这个十六进制字符串转换为十进制格式:

parseInt('1f42c803ac5f267802916924e52a3e1b', 16)

在Python中,可以使用以下代码将这个十六进制字符串转换为十进制格式:

int('1f42c803ac5f267802916924e52a3e1b', 16)

为什么这两个函数返回不同的值?

英文:

Getting different values converting the same hex string to decimal format in Javascript and Python!

Assume we have this hex string:

1f42c803ac5f267802916924e52a3e1b

We want to convert this string to decimal format.
what can we do in JavaScript:

parseInt('1f42c803ac5f267802916924e52a3e1b', 16)

what can we do in Python:

int('1f42c803ac5f267802916924e52a3e1b', 16)

why these 2 function return different values?

答案1

得分: 1

在JavaScript和Python中,将精确的十六进制字符串转换为十进制格式会得到不同的值,这是因为这两种语言处理大数的方式不同。Python没有真正的数值大小限制,但在JavaScript中,有32位(4字节)存储整数的限制。

在JavaScript中,parseInt函数将十六进制字符串转换为32位有符号整数。32位有符号整数可以表示的最大值是2,147,483,647。结果值超过了这个最大值,所以JavaScript会截断超过第32位的位数,导致精度损失。(注意你的十六进制数有多长 - 十进制版本会更长,使用更多的位)。

在Python中,int函数没有同样的限制。它可以处理任意大的整数而不会丢失精度。因此,当你使用Python中的int将十六进制字符串转换为十进制时,你会得到正确和精确的结果。


你可以使用在ECMAScript 2020(ES2020)中引入的BigInt数据类型来获得正确的结果。BigInt允许你处理任意大的整数。

const decimalValue = BigInt('0x1f42c803ac5f267802916924e52a3e1b');

得到的decimalValue将是一个BigInt对象,而不是普通的JavaScript number类型。

英文:

You get different values when converting the exact hex string to decimal format in JavaScript and Python due to a difference in how the two languages handle large numbers. Python has no real limitation on how large a number can get. In JavaScript, you have the limitation of 32 bits (4 bytes) to store an integer.

The parseInt function converts the hexadecimal string to a 32-bit signed integer in JavaScript. The maximum value that a 32-bit signed integer can represent is 2,147,483,647. The resulting value exceeds this maximum, so JavaScript truncates the bits beyond the 32nd bit, leading to a loss of precision. (Note how long your hexadecimal number is – the decimal version will be even longer, using more bits).

The int function does not have the same limitation in Python. It can handle arbitrarily large integers without losing precision. So, when you convert the hex string to a decimal using int in Python, you get the correct and precise result.


You can use the BigInt data type introduced in ECMAScript 2020 (ES2020) to obtain the correct result. BigInt allows you to work with arbitrarily large integers.

const decimalValue = BigInt('0x1f42c803ac5f267802916924e52a3e1b');

The resulting decimalValue will be a BigInt object, not a normal JavaScript number type.

huangapple
  • 本文由 发表于 2023年6月1日 01:22:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/76375945.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定