Language: EN

javascript-tipo-number

The Number Type in JavaScript

  • 5 min

In JavaScript, the Number data type allows us to handle numeric values and perform mathematical operations on them.

Unlike other languages that have different types for integers and floating-point numbers, JavaScript uses a single type for both cases. This simplifies the manipulation of numbers (but also introduces certain problems, which we will see at the end).

Declaring Number type variables

To declare a variable with a numeric value, we simply use the let or const keyword, followed by the variable name and the value we want to assign. For example:

let age = 25;
const pi = 3.14159;

In this case,

  • The variable age has been declared as an integer
  • The constant pi as a decimal number

As we mentioned, in JavaScript there is no difference between creating a number with decimals or without decimals

It is also possible to use scientific notation when working with very large or very small numbers.

const large = 1.5e10; // 15,000,000,000
const small = 2.5e-3; // 0.0025

Arithmetic operations with Number type

We can perform arithmetic operations with Number type variables using the basic mathematical operators.

let a = 10;
let b = 5;
let c = a + b; // c = 15
let d = a - b; // d = 5
let e = a * b; // e = 50
let f = a / b; // f = 2
let g = a % b; // g = 0

We can also use parentheses to group operations and establish the order of precedence. For example:

let result = (5 + 10) * 2; // result = 30

JavaScript also has increment (++) and decrement (--) operators, which are useful for quickly manipulating numbers:

let x = 5;
x++;  // Now x is 6
x--;  // Now x is back to 5

Comparisons and sorting

Numbers can be compared using standard comparison operators:

let x = 5;
let y = 10;

console.log(x > y);   // false
console.log(x < y);   // true
console.log(x === y); // false
console.log(x !== y); // true

Be aware of possible precision issues. We will see more below 👇

Allowed value range

The Number type can handle a very large range of values, although not infinite. The maximum value that can be represented is Number.MAX_VALUE, which is approximately 1.79e+308.

If this value is exceeded, the value Infinity is obtained:

console.log(Number.MAX_VALUE);  // 1.7976931348623157e+308
console.log(1e309);             // Infinity

Similarly, the smallest value that can be represented is Number.MIN_VALUE, which is approximately 5e-324.

console.log(Number.MIN_VALUE);  // 5e-324
console.log(-1e309);            // -Infinity

NaN and Infinity

In addition to regular numeric values, JavaScript also has two special values that belong to the Number type: NaN and Infinity.

  • NaN: stands for “Not a Number”. It is the result of an arithmetic operation that does not make sense, such as division by zero, or converting a string that cannot be interpreted as a number.
let number = "text" * 2; // NaN
  • Infinity: represents an infinite numeric value, either positive or negative. It can be obtained by dividing any number by zero or exceeding the limits of the Number type.
let inf = 1 / 0; // Infinity
let minusInf = -1 / 0; // -Infinity

Data type conversion

Implicit conversion

JavaScript performs implicit conversions between types when using operators that require specific types. For example, adding a number and a string converts the number to a string:

let number = 5;
let text = " apples";

let result = number + text; // "5 apples"

Explicit conversion

You can explicitly convert values using the Number(), String(), parseInt(), and parseFloat() functions:

let stringNumber = "42";

let number = Number(stringNumber); // 42
let floatNumber = parseFloat("3.14"); // 3.14
let intNumber = parseInt("101", 2); // 5 (in base 2)

Methods to manipulate Number

JavaScript provides many methods for working with Numbers.

Precision Issues in Number

The double-precision floating-point representation can lead to precision issues due to the way decimal numbers are stored in memory. For example:

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

This unexpected result is due to some decimal numbers not being precisely representable in binary.

To resolve these precision issues, it is common to use techniques such as rounding:

let result = 0.1 + 0.2;
console.log(Math.round(result * 100) / 100);  // 0.3

Due to these issues, number comparisons can be problematic. Therefore, instead of using direct comparisons, it is better to use a tolerance or margin of error:

let x = 0.1 + 0.2;
let y = 0.3;

let epsilon = 1e-10; // Tolerance

console.log(Math.abs(x - y) < epsilon); // true

Bit representation Advanced

Numeric values in JavaScript are based on the IEEE 754 standard, which means that all numbers are represented in 64-bit double precision format (Double Precision Floating Point).

The Number type uses 64 bits in memory, of which:

  • 1 bit is for the sign (positive or negative),
  • 11 bits are for the exponent,
  • 52 bits are for the mantissa (the significant part of the number).