W3docs

JavaScript BigInt

Learn JavaScript BigInt: how to create and use arbitrary-precision integers, arithmetic and comparison rules, conversion gotchas, and real-world use cases.

Introduction to JavaScript BigInt

BigInt is a built-in JavaScript primitive type that represents whole numbers of arbitrary size — integers far larger than the regular Number type can hold safely. This guide explains why BigInt exists, how to create and operate on it, where it shines (finance, cryptography, large-scale computation), and the gotchas to watch for.

Why BigInt Exists

JavaScript's Number type is a 64-bit floating-point value. It can only represent integers exactly up to Number.MAX_SAFE_INTEGER, which is 2^53 - 1 (9007199254740991). Beyond that, ordinary arithmetic silently loses precision:

javascript— editable

When you need exact integers larger than this — IDs from a database, currency in the smallest unit, cryptographic keys, factorials — BigInt is the answer.

Understanding BigInt in JavaScript

A BigInt is a distinct primitive type from Number. The typeof operator returns "bigint", and it has its own arithmetic rules.

Syntax and Creation

Create a BigInt by appending n to an integer literal, or by calling the BigInt() function on a number or a string.

javascript— editable

Use the string form when the value comes from input or exceeds what a numeric literal can express safely. Passing a non-integer number (like BigInt(1.5)) throws a RangeError.

Basic Operations with BigInt

BigInt supports the same arithmetic operators as Number, but both operands must be BigInt. Division truncates toward zero — there is no fractional part.

javascript— editable

Note first / second is 2n, not 2.5BigInt division drops the remainder rather than producing a fraction.

Comparing BigInt and Number

Even though they are different types, BigInt and Number can be compared with relational operators and the loose equality operator ==. Only strict equality === distinguishes the types, because it also checks the type.

javascript— editable

See comparison operators for how == and === differ in general.

Limitations and Type Coercion

While powerful, BigInt has specific limitations compared to the standard Number type:

  • No Implicit Coercion in Arithmetic: You cannot add, multiply, etc. a BigInt and a Number together — it throws a TypeError. Convert one side first.
  • Math Functions: Standard Math methods (e.g., Math.sqrt(), Math.floor()) do not accept BigInt arguments and will throw.
  • No Unary Plus: +10n throws — use Number(10n) instead.
  • JSON: JSON.stringify cannot serialize a BigInt and throws a TypeError; convert it to a string yourself first.
  • Explicit Conversion: Convert between types with Number(bigint) or BigInt(number). Going to Number may lose precision for very large values.
javascript— editable

Practical Applications of BigInt

BigInt's ability to handle large numbers precisely makes it invaluable in financial calculations, cryptography, and large-scale computing.

Financial Calculations

In financial applications, BigInt helps avoid the rounding errors associated with floating-point numbers.

javascript— editable

This example illustrates using BigInt for high-precision arithmetic in financial contexts, ensuring accuracy in transactions.

Info

BigInt is an essential tool in cryptography, playing a crucial role in generating large prime numbers. These numbers are fundamental to the security mechanisms of encryption algorithms, ensuring data is protected effectively.

High-Performance Computing

The following example demonstrates using BigInt in matrix multiplication for large-scale data processing, ensuring precision and efficiency, and we'll include a complete implementation of the matrix multiplication function using BigInt. This will involve initializing matrices, populating them with BigInt values, and then performing the multiplication. Here's a step-by-step real example:

Step 1: Initialize Matrix

First, we create a function to initialize a matrix of given dimensions with BigInt zeros.

function initializeMatrix(rows, cols) {
  let matrix = new Array(rows);
  for (let i = 0; i < rows; i++) {
    matrix[i] = new Array(cols).fill(0n);
  }
  return matrix;
}

Step 2: Matrix Multiplication Function

Next, we define the function to perform matrix multiplication. Both input matrices must contain BigInt values, and the resulting matrix will also contain BigInt values.

function multiplyMatrices(matrixA, matrixB) {
  if (matrixA[0].length !== matrixB.length) {
    throw new Error('Number of columns in Matrix A must equal number of rows in Matrix B');
  }

  let resultMatrix = initializeMatrix(matrixA.length, matrixB[0].length);

  for (let i = 0; i < matrixA.length; i++) {
    for (let j = 0; j < matrixB[0].length; j++) {
      let sum = 0n;
      for (let k = 0; k < matrixA[0].length; k++) {
        sum += matrixA[i][k] * matrixB[k][j];
      }
      resultMatrix[i][j] = sum;
    }
  }
  return resultMatrix;
}

Step 3: Example Matrices and Multiplication

Finally, we create some example matrices and perform the multiplication. The matrices are filled with BigInt values.

javascript— editable

Output Explanation

This example multiplies two 2x2 matrices filled with BigInts. The output will be a new matrix where each element is the result of the matrix multiplication rules applied to BigInt values. Here’s what the multiplication looks like:

  • Result[0][0] = (1n * 2n) + (2n * 1n) = 2n + 2n = 4n
  • Result[0][1] = (1n * 0n) + (2n * 2n) = 0n + 4n = 4n
  • Result[1][0] = (3n * 2n) + (4n * 1n) = 6n + 4n = 10n
  • Result[1][1] = (3n * 0n) + (4n * 2n) = 0n + 8n = 8n

This functionality demonstrates how BigInt can be utilized to handle large numbers in complex computations like matrix multiplication, ensuring precision and performance in JavaScript applications requiring numerical computations of large scale.

Warning

Use BigInt judiciously as it can impact performance due to its higher memory and processing demands compared to standard numbers. Only use it when necessary for handling very large integers.

Best Practices for Using BigInt in JavaScript

When incorporating BigInt into your JavaScript projects, consider the following best practices to optimize performance and maintainability:

  1. Consistent Data Types: Avoid mixing BigInt with other numeric types. Coercion between BigInt and Number can lead to errors or unexpected behavior. Ensure all operands in calculations are of BigInt type when necessary.
  2. Use Case Appropriateness: Employ BigInt only when dealing with numbers outside the safe range for standard JavaScript numbers. Overusing BigInt can lead to performance overhead.
  3. Memory Considerations: Although BigInt can handle very large numbers, be mindful of the memory usage in your applications, especially in environments with limited resources.
  4. Compatibility Checking: Before using BigInt, check the compatibility with the target JavaScript environment, as older browsers or some JavaScript engines may not support it.
  5. Efficient Algorithms: When performing operations with BigInt, especially in loops or recursive functions, optimize your algorithms to minimize performance impacts.

Understanding Polyfills for BigInt in JavaScript

JavaScript's BigInt type is essential for handling very large integers, but it is not supported in all environments. To ensure compatibility across different browsers and JavaScript engines, especially older ones, polyfilling BigInt can be a practical approach.

What is Polyfilling?

Polyfilling is a technique used to implement features in web browsers that do not support those features natively. It involves including a script that adds the missing functionality to the browser's JavaScript environment, allowing developers to use modern features without waiting for all users to switch to browsers that support those features.

Polyfilling BigInt

Since BigInt is a relatively new addition to JavaScript, not all environments support it. Polyfilling allows you to use BigInt in these unsupported environments by simulating its functionality. This can be crucial for applications requiring high-precision calculations in environments where updating to the latest browser version isn't feasible.

Implementing a BigInt Polyfill

Implementing a BigInt polyfill involves creating or including a library that mimics the BigInt behavior. Here's a simple conceptual demonstration of how a polyfill wrapper might be structured:

// Conceptual demonstration only. A true BigInt polyfill is complex and impractical.
// This example uses Number conversion internally for simplicity and is not suitable 
// for production large-integer handling.
if (typeof BigInt === "undefined") {
    window.BigInt = function(value) {
        return {
            value: value,
            toString: function() { return value + "n"; },
            add: function(other) { return BigInt(Number(this.value) + Number(other.value)); },
            subtract: function(other) { return BigInt(Number(this.value) - Number(other.value)); }
        };
    };
}

Limitations of Polyfilling BigInt

While polyfills can provide backward compatibility, they are not a perfect substitute for native implementations:

  • Performance: Polyfills can't match the performance of native BigInt operations as they are implemented in JavaScript rather than in lower-level code optimized by browser vendors.
  • Complexity: Accurately mimicking all aspects of a complex feature like BigInt can be challenging and might lead to bugs or inconsistencies.
  • Maintenance: Keeping the polyfill updated with any changes to the official BigInt specification requires ongoing maintenance.
Info

Consider using a BigInt polyfill to enable compatibility in older browsers that don't support BigInt natively. However, be aware that polyfills may not offer the same performance as native implementations and should be used as a temporary solution until native support is more universally available.

Conclusion

BigInt lets JavaScript represent integers of any size with exact precision, filling the gap left by the 53-bit safe limit of the Number type. Reach for it whenever an integer might exceed Number.MAX_SAFE_INTEGER — large database IDs, currency in minor units, cryptographic values, and big-number math — but keep Number for everyday calculations where fractions and Math methods matter. Remember the core rule: never mix BigInt and Number in arithmetic without an explicit conversion.

Practice

Practice
What is the correct way to create a BigInt in JavaScript?
What is the correct way to create a BigInt in JavaScript?
Was this page helpful?