# JavaScript: The Weird Numbers

This topic is talk about the JavaScript weird numbers that are strange sometimes. Before we starting that, do you know what is the smallest and largest representable value in JavaScript?

```
// The largest representable number
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
// The smallest representable number
console.log(Number.MIN_VALUE); // 5e-324
```

Now we can try to print the largest and smallest number can be representable value in JavaScript.

```
console.log(1.7976931348623157e+308); // 1.7976931348623157e+308
console.log(5e-324); // 5e-324
```

Cool, it seems works right? But what if we print it larger and smaller than the representable value in JavaScript?

```
console.log(1.7976931348623157e+309); // Infinity
console.log(5e-325); // 0
```

Do you see that? The output seems so weird, it can’t represent the actual number now. **JavaScript can’t represent the actual number if it over the max/min representable value. When it more than the representable value, it became INFINITY. If it less than representable value, it became 0.**

We just talked about when the numbers is exceed the representable value, it will became **Infinity** right? What if we add, minus, multiple or divide it?

```
console.log(Infinity + 5); // Infinity
console.log(Infinity - 5); // Infinity
console.log(Infinity * 5); // Infinity
console.log(Infinity / 5); // Infinity
// What if we add, minus, multiple or divide with Infinity?
console.log(Infinity + Infinity); // Infinity
console.log(Infinity - Infinity); // NaN
console.log(Infinity * Infinity); // Infinity
console.log(Infinity / Infinity); // NaN
```

In all the case above, it they remain **Infinity**. You may surprise that when** Infinity minus/divide from itself, it return will NaN.**

Now, there another case that it may become **Infinity**. **When numbers divided with 0, it became infinity.**

```
console.log(10 + 0); // 10
console.log(10 - 0); // 10
console.log(10 * 0); // 0
console.log(10 / 0); // Infinity
```

But when 0 divided with 0. It don’t return **Infinity**, it returned **NaN**.

```
console.log(0 + 0); // 0
console.log(0 - 0); // 0
console.log(0 * 0); // 0
console.log(0 / 0); // NaN
```

Many times we think that -0 and +0 are same because when we compare both of it, it return true. But, they are doing totally different things in calculation. Let’s see how.

```
console.log(-0 === +0); // It returned true
// But, they are doing totally different things in calculation
```

Next, the we tried to divide it with negative 0 to see how the number works in JavaScript. As you can see, when **0/-0** it returned NaN.

```
console.log(0 / -0); // NaN - it returned NaN because there is no -NaN
console.log(10 / -0); // -Infinity - But in here it became negative Infinity
```

JavaScript Numbers are 64-bit Floating Point, It only able to display accurate up to 15 digits. If the number are over 15 digits, the output might be difference.

```
console.log(999999999999999); // 999999999999999
console.log(9999999999999999); // 10000000000000000
```

However, the maximum number of decimals is 17. Like any others programming languages, the floating point arithmetic is not always accurate. Try out the code below.

`console.log(0.1 + 0.2); // 0.30000000000000004`

You may be surprised that in JavaScript, 0.1 + 0.2 === 0.3 is false. Looks weird right? If you don’t believe it, just give it a try. Now we going to try it in boolean.

`0.1 + 0.2 === 0.3 // false`

Unfortunately, it doesn’t work. To learn more about it, please read this for details. https://0.30000000000000004.com/

There is also weird case when comparing to the number you should aware. Let’s look at the code here.

```
1 < 2 < 3; // True
3 > 2 > 1; // False
```

**Why it returned false when 3 > 2 > 1?**

This is because because JavaScript executes the expressions from left to right.

```
// Step 1
3 > 2 > 1;
// Step 2
true > 1;
```

In the second step, when comparing true is greater than 1, it returned false. This is because true is consider equal to 1 too.

```
true == 1; // true
true + true === 2; // true
true - true === 0; // true
```

I also experiment with the `Math.max()`

and `Math.min()`

function. It’s interesting to see the `Math.max()`

is smaller than `Math.min()`

. This is because the ** Math.max()** or

**function returns the largest/lowest value number passed in the function. If you didn’t pass any parameter, it returned**

`Math.min()`

`Infinity/-Infinity`

. If you pass the parameter isn’t a number it return **NaN**

.```
Math.max() > Math.min(); // false
Math.max() < Math.min(); // true
Math.max(); // -Infinity
Math.min(); // Infinity
```

Thanks for reading!I hope you enjoyed it, if you know something interesting too, please let me know! [email protected]