Example 1 — Everyday Integer
Small whole numbers are always safe.
Number.isSafeInteger(3); // true 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.
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.
Number only
boolean
Safe integer
±(253−1)
None
Everywhere
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_INTEGER … Number.MAX_SAFE_INTEGER (±9,007,199,254,740,991).
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.
isSafeInteger() MethodPass any value to Number.isSafeInteger(value). You get true only when all of these are true:
"number".Number.isInteger).Number.MIN_SAFE_INTEGER and Number.MAX_SAFE_INTEGER (inclusive).Floats, strings, NaN, Infinity, and integers outside that range all return false.
General form of the static method Number.isSafeInteger:
Number.isSafeInteger(testValue) A boolean:
| Value | Returns |
|---|---|
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 / Infinity | false |
false.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 | Goal | Code |
|---|---|
| Safe integer check | Number.isSafeInteger(x) |
| Upper bound | Number.MAX_SAFE_INTEGER |
| Lower bound | Number.MIN_SAFE_INTEGER |
| Any integer (may be unsafe) | Number.isInteger(x) |
| Huge exact integers | BigInt (not Number) |
| Parse then check | Number.isSafeInteger(Number(s)) |
Four facts to remember about Number.isSafeInteger().
staticCall on Number, not instances
booleantrue only for safe integers
2^53−1MAX_SAFE_INTEGER magnitude
BaselineES2015+ everywhere modern
isSafeInteger() vs isInteger()Number.isSafeInteger(x) | Number.isInteger(x) | |
|---|---|---|
3 | true | true |
2 ** 53 - 1 | true | true |
2 ** 53 | false | true |
3.1 | false | false |
| Best for | Precision-safe whole numbers | Any integer Number value |
Examples follow MDN patterns. Use View Output or Try It Yourself for each case.
Everyday integers and the safe upper bound.
Small whole numbers are always safe.
Number.isSafeInteger(3); // true 3 is an integer well inside the safe range, so the result is true. 3.0 is the same value and also returns true.
2 ** 53 - 1 is the upper edge of the safe range.
Number.isSafeInteger(2 ** 53 - 1); // true That value equals Number.MAX_SAFE_INTEGER (9007199254740991). An MDN-style helper might print “Precision safe.” here.
Unsafe magnitudes, floats, and non-numbers.
2 ** 53 is an integer Number value, but not a safe integer.
Number.isSafeInteger(2 ** 53); // false 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.
Fractional numbers are never safe integers.
Number.isSafeInteger(3.1); // false Safe integers must first be integers. 3.1 fails for the same reason Number.isInteger(3.1) fails.
Numeric-looking strings are rejected.
Number.isSafeInteger("3"); // false The argument is a string, so the result is false. Use Number.isSafeInteger(Number("3")) when text input should count.
Number.isSafeInteger() DecidesAny JavaScript value can be passed in.
Non-numbers and floats fail immediately.
Must sit between MIN and MAX_SAFE_INTEGER.
true only for precision-safe integers.
Number.isSafeInteger(x) only.Number.MIN_SAFE_INTEGER … Number.MAX_SAFE_INTEGER.2 ** 53 can look like an integer but is not safe — neighboring integers collide in floating-point.BigInt.Number.isSafeInteger() is Baseline Widely available — part of ES2015 and supported in every modern browser and Node.js.
Safe for production everywhere. Use it whenever integer precision matters beyond everyday small counts.
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).
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.
Number.isSafeInteger(x) on the constructorNumber.MAX_SAFE_INTEGER when teaching boundsBigInt for larger exact integersNumber(s) before checking(5).isSafeInteger() — that is not a Number methodNumber.isInteger alone guarantees precision"3" to passNumber.isSafeInteger()Static, strict check for precision-safe whole numbers.
static
APIboolean
Result2^53−1
Rangeunsafe
TrapBaseline
Support2 ** 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.
Return to the hub for instance and static Number tutorials.
8 people found this page helpful