Why Does JavaScript’s parseInt(0.0000005)
Print “5”? 🤔
JavaScript’s parseInt()
function is quite handy for converting strings into integers, but it can sometimes lead to surprising results. One such mystery is when you call:
parseInt(0.0000005)
And the output is 5
! 😲
The Reason Behind It
Here’s the simple explanation: parseInt()
doesn't just look at the number itself. It first converts the value to a string. So, when we pass 0.0000005
, JavaScript automatically converts it to the string "5e-7"
. 🎢
Now, parseInt()
starts reading the string from the left and stops at the first non-numeric character. In "5e-7"
, it sees 5
first, so it stops there and returns 5
. It doesn’t process the scientific notation part (e-7
), which is why it ignores the decimals.
Summary 📜
-
parseInt()
processes numbers as strings. - It only reads up to the first non-numeric character.
- The result is the integer before the first non-digit character.
Final Trick Question! 🧩
What will console.log(0.1 + 0.2 == 0.3)
return? 🤨 Try it and see if you can crack this JavaScript mystery!
Top comments (24)
It's personally why I convert things into numbers using
+
rather than parsing. I don' have to remember or even know if it's a number or a string. My preference:Nice trick @miketalbot ,
Using the
+
simplifies conversion by implicitly handling type coercion, making the code more concise without needing explicit parsing.Nice catch!
As you correctly pointed out,
parseInt
converts the number to a string. And JavaScript converts numbers to strings using scientific notation when the magnitude of the number (i.e. the number without the sign) is larger or equal than 1000000000000000000000 (21 zeroes) or smaller or equal than 0.0000001 (7 zeroes.)Exactly! @whereisthebug Do you know any other tricky things about JS?
What do you mean? I thought the whole javascript was a tricky thing 😂
I don't know what's happening in JS. It is javascript bug or something else, okay I understand the concept of
parseInt(0.0000005)
thanks for explaining that but whyconsole.log(0.1 + 0.2 == 0.3)
returns False.Also I think developers must know these edge cases points of js because somehow it will used in case of payments then it really hard to debug for begineers to debug
@john12 ,
The behavior you're noticing isn't a bug, but a well-known quirk in JavaScript (and many other programming languages) related to how it handles floating-point arithmetic.
At least
but that is great catch I don't know about it ( I was never use parseInt )
Yes,
parseInt("0.0000005")
returns0
because parseInt stops parsing at the decimal point.So , I thinks it's good to convert numbers to string before parsing into integer.
That would be great you’d started with the history and mentioned that parseInt was designed to parse stings to numbers for cases like “10px” -> “10”, that explains a lot.
That worth mentioning that according to IEEE 754 all other programming languages do the same math and add a link to 0.30…4.com
That's cool, I already know about second one , what about this
console.log(null == undefined);
That one is easy @works ,
==
means loose equality that convert both values to a common type before comparing. So it returnstrue
If we usr
===
then it returns falseYes correct.
This is such an interesting topic—parseInt() is one of those quirks in JavaScript that always surprises people! I really liked how you explained the behavior with the radix and how it defaults to 10 in most cases. It’s definitely one of those ‘gotcha’ moments for developers. Personally, I try to stick with Number() for clarity, but there are definitely cases where parseInt() shines. Have you ever run into unexpected issues with it in real-world projects? Great work on the article!
Thanks @boniface_gordian
The
0.1+0.2===0.3
isn't a JavaScript issue, that's an IEEE 754 floating point math error. This is pretty common to a number of languages including JavaScript, Python, Perl, C/C++, etc.parseInt()
is indeed handy when used correctly. Calling it with anumber
instead of astring
would be considered a mistake.If the intention was to convert a float into an integer, the popular quick hack is
|0
as in0.0000005|0
. The more official way is to useMath.floor()
obviously.parseInt()
is simply the wrong method to do this.Also note that negative values might or might not do what you'd expect. Depends on the use case.
I understand that the logic was maybe expecting a string and suddenly a number comes along at runtime and it was "working most of the time". The solution from Mike Talbot is indeed the best if you need to counter this issue. You can of course still combine it with the
|0
hackIt's your own fault as a developer. The function's name clearly states it will return an integer. You cannot possible expect a floating-point value to come out correctly from parse*Int*.
I hope you are just joking.
Why? Is there a punch line in what I wrote? Or is it normal to expect a floating-point value from a function named
parseInt
, especially when there's another function calledparseFloat
? What's confusing here?I laughed at first as well because I was thinking with JS mindset. And for anyone with a bit of experience with JS that is indeed funny.
The parseInt function is supposed to receive anything and try to return an int from it.
So yes, most of the time the input is a non int value that will return an int, that’s why Jose’s first comment sound like a sarcastic joke.
But my guess is that the name of the function is not so specific and one could understand it as a function that receives and int then parses it into something else.
But what makes it funny is the arrogant tone of blaming who wrote the code based on a wrong understanding of what the function does. 😂
It’s funny if it is a joke, but even funnier because it’s not 😆
Ah, I see. FYI and full disclosure: I don't blame the author directly when I said "you as a programmer". "You" here refer to anybody that stumbled into this problem expecting a float out of
parseInt
, hehe.Some comments may only be visible to logged-in visitors. Sign in to view all comments.