The mistery behind parseInt(0.0000005)

A bit of background

The parseInt() method parses a value as a string and returns the first integer.

A radix parameter specifies the number system to use (2 = binary, 10 = decimal, 16 = hexadecimal).
If radix is omitted, JavaScript assumes a radix of 10. If the value begins with 0x, it will assume radix 16.

The return type of parseInt is integer or NaN.
If not NaN, the return value will be the integer that is the first argument taken as a number in the specified radix.

If parseInt encounters a character that is not a numeral in the specified radix, it ignores it and all succeeding characters.

Solving the mistery...

Reading through the ECMAScript 2021 we'll see this:

When parseInt function is called, the following steps are taken:

  • Let inputString be ? ToString(string)
  • Let S be ! TrimString(inputString, start)
  • ...

I'll leave the rest of the steps to your discretion to read.

So let's look again at what parseInt(numericalString) does with its first argument: if it's not a string, then it is converted to a string, then parsed and if it encounters a character that is not a numeral - it ignores it and all succeeding characters

In our case, String(0.0000005) === "5e-7" and considering the above mentions, the return value of parseInt("5e-7") is 5

Conclusion

parseInt is a function that parses numerical strings to integers and you must be careful when trying to extract the integer part of a float.

A cool challenge before my next JavaScript post:
Can you explain why parseInt(999999999999999999999) equals 1?

Write your considerations in the comments section below!