5

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.

Dhruvil21_04
  • 1,804
  • 2
  • 17
  • 31

3 Answers3

9

MDN doc

BigInt is 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 the Number primitive and represented by the Number.MAX_SAFE_INTEGER constant. BigInt can 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 operations
  • Because coercing between Number 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.
Dhruvil21_04
  • 1,804
  • 2
  • 17
  • 31
1

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.

Daniel Viglione
  • 8,014
  • 9
  • 67
  • 101
  • https://stackoverflow.com/q/53335545/11107541 – starball Apr 29 '23 at 21:24
  • @user useful link, but not relevant to this answer. – Daniel Viglione Apr 29 '23 at 22:11
  • "_BigInt was added to ES2020 to allow the representation of 64-bit integers_" I wouldn't say that was the only or main goal, since at least according to the spec it's for arbitrary size. – starball Apr 29 '23 at 22:16
  • @user again you didn't deliver a point. I never said it was the "only or main goal". But it was certainly an important reason for its existance. The Number type cannot represent 64 bit integers so JavaScript needed a type that would, as most other programming languages have such type. Your conjecture is useless, effectively an irrelevant comment. – Daniel Viglione Apr 29 '23 at 22:21
1

The differences between BigInt and Number:

Number BigInt
Safe Range Number.MAX_SAFE_INTEGER loses precision outside this range Extremely large integers
Math Supports Math object basic arithmetic operations + * - % **
Decimal vs. Integer integers and decimals 1.00, 2.56 only integers 1n, 2n and 5n / 2 === 2n
Syntax No special syntax Append n to the end, new BigInt('100')
Type Conversion Automatically converts Number to BigInt in operations Requires explicit conversion to Number for arithmetic with Number values
JSON Supports 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.

zemil
  • 3,235
  • 2
  • 24
  • 33