JavaScript Number isSafeInteger() Method

Beginner
⏱️ 10 min read
📚 Updated: Jul 2026
🎯 5 Examples
🚀 5 Try-it labs
Static method

What You’ll Learn

Number.isSafeInteger() is a static method on Number (same API as MDN Number.isSafeInteger). Call Number.isSafeInteger(value) — not on a number instance. It returns true only for integers inside the safe range. This tutorial covers syntax, MAX_SAFE_INTEGER, the difference from isInteger, five examples, and try-it labs.

01

Call on

Number only

02

Returns

boolean

03

True when

Safe integer

04

Range

±(253−1)

05

Coercion

None

06

Baseline

Everywhere

Introduction

JavaScript numbers use IEEE-754 floating-point. Beyond about 15–16 significant digits, not every integer can be stored exactly — so IDs, counters, and money-in-cents math can silently lose precision.

Number.isSafeInteger() answers: “Is this an integer I can trust at full precision?” The safe range is Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER (±9,007,199,254,740,991).

💡
Static Method

Static methods belong to Number itself. Always write Number.isSafeInteger(x). There is no (5).isSafeInteger() on Number.prototype.

This page is part of JavaScript Number Methods. Related checks include Number.isInteger(), Number.isFinite(), and Number.isNaN(). For larger exact integers, use BigInt.

Understanding the isSafeInteger() Method

Pass any value to Number.isSafeInteger(value). You get true only when all of these are true:

  • The type is "number".
  • The value is an integer (same idea as Number.isInteger).
  • It lies between Number.MIN_SAFE_INTEGER and Number.MAX_SAFE_INTEGER (inclusive).

Floats, strings, NaN, Infinity, and integers outside that range all return false.

📝 Syntax

General form of the static method Number.isSafeInteger:

JavaScript
Number.isSafeInteger(testValue)

Parameters

  • testValue (any) — the value to test for being a safe integer.

Return value

A boolean:

ValueReturns
Safe integer (e.g. 3, 2 ** 53 - 1)true
2 ** 53 (outside safe range)false
Non-integer (e.g. 3.1)false
Non-number (e.g. "3")false
NaN / Infinityfalse

Exceptions

  • None for normal calls — invalid types simply return false.

Common patterns

JavaScript
Number.isSafeInteger(3);              // true
Number.isSafeInteger(2 ** 53 - 1);    // true
Number.isSafeInteger(2 ** 53);        // false
Number.isSafeInteger(3.1);            // false
Number.isSafeInteger("3");            // false
Number.isSafeInteger(Number.MAX_SAFE_INTEGER); // true

⚡ Quick Reference

GoalCode
Safe integer checkNumber.isSafeInteger(x)
Upper boundNumber.MAX_SAFE_INTEGER
Lower boundNumber.MIN_SAFE_INTEGER
Any integer (may be unsafe)Number.isInteger(x)
Huge exact integersBigInt (not Number)
Parse then checkNumber.isSafeInteger(Number(s))

🔍 At a Glance

Four facts to remember about Number.isSafeInteger().

Kind
static

Call on Number, not instances

Returns
boolean

true only for safe integers

Limit
2^53−1

MAX_SAFE_INTEGER magnitude

Support
Baseline

ES2015+ everywhere modern

📋 isSafeInteger() vs isInteger()

Number.isSafeInteger(x)Number.isInteger(x)
3truetrue
2 ** 53 - 1truetrue
2 ** 53falsetrue
3.1falsefalse
Best forPrecision-safe whole numbersAny integer Number value

Examples Gallery

Examples follow MDN patterns. Use View Output or Try It Yourself for each case.

📚 Getting Started

Everyday integers and the safe upper bound.

Example 1 — Everyday Integer

Small whole numbers are always safe.

JavaScript
Number.isSafeInteger(3);  // true
Try It Yourself

How It Works

3 is an integer well inside the safe range, so the result is true. 3.0 is the same value and also returns true.

Example 2 — Largest Safe Integer

2 ** 53 - 1 is the upper edge of the safe range.

JavaScript
Number.isSafeInteger(2 ** 53 - 1);  // true
Try It Yourself

How It Works

That value equals Number.MAX_SAFE_INTEGER (9007199254740991). An MDN-style helper might print “Precision safe.” here.

📈 Practical Patterns

Unsafe magnitudes, floats, and non-numbers.

Example 3 — Just Outside the Safe Range

2 ** 53 is an integer Number value, but not a safe integer.

JavaScript
Number.isSafeInteger(2 ** 53);  // false
Try It Yourself

How It Works

Number.isInteger(2 ** 53) is still true, but neighboring integers cannot all be represented distinctly — so precision may be lost. Prefer BigInt for larger exact values.

Example 4 — Non-Integer Float

Fractional numbers are never safe integers.

JavaScript
Number.isSafeInteger(3.1);  // false
Try It Yourself

How It Works

Safe integers must first be integers. 3.1 fails for the same reason Number.isInteger(3.1) fails.

Example 5 — No String Coercion

Numeric-looking strings are rejected.

JavaScript
Number.isSafeInteger("3");  // false
Try It Yourself

How It Works

The argument is a string, so the result is false. Use Number.isSafeInteger(Number("3")) when text input should count.

🚀 Common Use Cases

  • Database / API IDs — confirm IDs stay within precise Number range (or switch to BigInt/string).
  • Counters & indexes — guard large tallies before increment math.
  • Money in cents — keep integer amounts inside the safe range.
  • Warn on precision loss — MDN-style helpers that flag unsafe magnitudes.
  • Stricter than isInteger — when “whole number” is not enough.
  • Choose BigInt — when values may exceed ±(253−1).

🧠 How Number.isSafeInteger() Decides

1

Receive value

Any JavaScript value can be passed in.

Input
2

Require a number integer

Non-numbers and floats fail immediately.

Type
3

Check safe range

Must sit between MIN and MAX_SAFE_INTEGER.

Bounds
4

Return boolean

true only for precision-safe integers.

📝 Notes

  • This is a static method — use Number.isSafeInteger(x) only.
  • Does not coerce strings, objects, or booleans.
  • Safe range: Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER.
  • 2 ** 53 can look like an integer but is not safe — neighboring integers collide in floating-point.
  • Every safe integer is an integer; not every integer is safe.
  • For exact integers beyond the safe range, use BigInt.

Browser & Runtime Support

Number.isSafeInteger() is Baseline Widely available — part of ES2015 and supported in every modern browser and Node.js.

Baseline · Widely available

Number.isSafeInteger()

Safe for production everywhere. Use it whenever integer precision matters beyond everyday small counts.

100% Universal support
Google Chrome Supported · Desktop & Mobile
Full support
Mozilla Firefox Supported · Desktop & Mobile
Full support
Apple Safari Supported · macOS & iOS
Full support
Microsoft Edge Supported · Chromium
Full support
Internet Explorer No native support · Use a polyfill
Polyfill
Opera Supported · Modern versions
Full support
Samsung Internet Supported · Android
Full support
Bun Supported · JavaScript runtime
Supported
Deno Supported · JavaScript runtime
Supported
Node.js Supported · Server runtime
Supported
Android WebView Supported · Modern WebView
Full support
Number.isSafeInteger() Excellent

Bottom line: Prefer Number.isSafeInteger over isInteger when IDs or large counters must stay precise. Switch to BigInt when values may exceed ±(2^53 − 1).

Conclusion

Number.isSafeInteger() is the modern, static way to ask whether a value is a whole number that JavaScript can represent with full integer precision — between MIN_SAFE_INTEGER and MAX_SAFE_INTEGER.

Continue with Number.isInteger() for any integer check, Number.isNaN() for NaN detection, or return to the Number methods hub.

💡 Best Practices

✅ Do

  • Call Number.isSafeInteger(x) on the constructor
  • Use it for IDs, counters, and cents-style money
  • Compare against Number.MAX_SAFE_INTEGER when teaching bounds
  • Switch to BigInt for larger exact integers
  • Parse text with Number(s) before checking

❌ Don’t

  • Write (5).isSafeInteger() — that is not a Number method
  • Assume Number.isInteger alone guarantees precision
  • Trust huge floating IDs without a safe-integer check
  • Expect strings like "3" to pass
  • Ignore BigInt when values may exceed ±(253−1)

Key Takeaways

Knowledge Unlocked

Five things to remember about Number.isSafeInteger()

Static, strict check for precision-safe whole numbers.

5
Core concepts
02

Returns

boolean

Result
² 03

Bound

2^53−1

Range
! 04

2^53

unsafe

Trap
05

Safe

Baseline

Support

❓ Frequently Asked Questions

Number.isSafeInteger(value) returns true only when value is an integer in the safe range from Number.MIN_SAFE_INTEGER to Number.MAX_SAFE_INTEGER (±(2^53 − 1)). Example: Number.isSafeInteger(3) is true; Number.isSafeInteger(2 ** 53) is false.
Yes. Call it on Number itself: Number.isSafeInteger(x). Do not call it on a number instance like (5).isSafeInteger() — that is not the Number API.
A safe integer can be exactly represented in IEEE-754 double precision, and nearby integers do not round to the same floating-point value. The range is −9007199254740991 to 9007199254740991.
Number.isInteger(2 ** 53) is true, but Number.isSafeInteger(2 ** 53) is false. Every safe integer is an integer, but not every integer Number value is safe.
No. Number.isSafeInteger("3") is false. Parse first if you need to accept text: Number.isSafeInteger(Number("3")).
It is Baseline Widely available (ES2015) and supported in every modern browser and Node.js.
Did you know?

2 ** 53 can be stored exactly as a Number, but 2 ** 53 + 1 cannot — it rounds back to 2 ** 53. That is why Number.isSafeInteger(2 ** 53) is false even though Number.isInteger(2 ** 53) is true.

More Number Methods

Return to the hub for instance and static Number tutorials.

Number methods hub →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

8 people found this page helpful