I just came across JavaScript's new data type BigInt. What are some of the real-time use cases where we have to use BigInt vs Number?
I also see that it doesn't have cross-browser compatibility at this point.
I just came across JavaScript's new data type BigInt. What are some of the real-time use cases where we have to use BigInt vs Number?
I also see that it doesn't have cross-browser compatibility at this point.
BigIntis a built-in object that provides a way to represent whole numbers larger than 2^53 - 1, which is the largest number JavaScript can reliably represent with theNumberprimitive and represented by theNumber.MAX_SAFE_INTEGERconstant.BigIntcan be used for arbitrarily large integers.
Difference:
BigInt cannot be used with methods in the built-in Math object and cannot be mixed with instances of Number in operationsNumber and BigInt can lead to loss of
precision, it is recommended to only use BigInt when values greater
than 2^53 are reasonably expected and not to coerce between the two
types.The differences between BigInt and Number:
Number |
BigInt |
|
|---|---|---|
| Safe Range | Number.MAX_SAFE_INTEGER; loses precision outside of this range |
Extremely large integers |
| Math operations | Supports the Math object |
Basic arithmetic operations: + * - % ** |
| Decimal vs. Integer support | Integers and decimals, e.g 1.00, 2.56 |
Only integers, e.g 1n, 2n. 5n / 2 === 2n |
| Syntax | No special syntax | Append n to the end of a number literal or use new BigInt('100') |
| Type Conversion | Automatically converts Number to BigInt in operations |
Requires explicit conversion to Number for arithmetic involving Number values |
| JSON | Supported by default | Not serializable by default |
Use BigInt when you need to work with extremely large integers or require precise integer arithmetic without any loss of precision.
The Number object uses a 64-bit floating-point format. With 64 bits allocated in memory, you have a sign bit, 11 bits for exponent, and 52 bits for the mantissa. Since you only have 52 bits to represent the mantissa, you can only safely represent integers between -(2^53 - 1) and 2^53 - 1. So what does this mean for Number and how does BigInt address it? Examples are usually helpful:
const nval1 = 9007199254740991 + 1
const nval2 = 9007199254740991 + 2
nval1 === nval2
# => true
Clearly, by using the comparison operator with numbers that extend beyond Number.MAX_SAFE_INTEGER leads to some unexpected results. Now let's try it with BigInt:
const bval1 = 9007199254740991n + 1n
const bval2 = 9007199254740991n + 2n
bval1 === bval2
# => false
In terms of practical use, BigInt was added to ES2020 to allow the representation of 64-bit integers, which are required for compatibility with many other programming languages and APIs.