JavaScript/Objekte/Number/isSafeInteger

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Methode Number.isSafeInteger(wert) prüft, ob der angegebene Wert eine Ganzzahl ist und in dem für Integerwerte sicheren Zahlenintervall Number.MIN_SAFE_INTEGER bis Number.MAX_SAFE_INTEGER. Damit ist sie strenger als Number.isInteger(), das auf die Prüfung des Zahlenintervalls verzichtet und deshalb für alle Werte außerhalb dieses Intervalls true meldet.

Syntax

Number.isSafeInteger(wert);

  • wert: Der zu prüfende Wert.


Rückgabewert

false
wenn Number.isInteger(wert) den Wert false zurückgibt.
wenn wert außerhalb des Intervalls -(253-1) .. -253-1 liegt
true
für alle anderen number-Werte.

Zahlen werden in JavaScript durch IEEE 754 Fließkommazahlen in doppelter Präzision repräsentiert. Dieses Zahlenformat hat die Eigenschaft, auch noch sehr große Werte darstellen zu können, aber nur mit begrenzter Genauigkeit. Dazu wird ein ganzzahliger Wert mit bis zu 53 Bits gespeichert und mit einem Faktor von 2n skaliert.

Wenn Sie eine echte Ganzzahl ohne Nachkommastellen speichern wollen, müssen Sie also eine IEEE 754 Fließkommazahl mit einem Skalierungsfaktor von 1 (oder 20) verwenden. Daraus ergibt sich ein verwendbarer Zahlenbereich von -(253-1) bis 253-1. Bei Werten außerhalb dieses Intervalls lässt das Zahlenformat keine Nachkommastellen mehr zu, weswegen Math.floor keine Nachkommastellen mehr entfernen kann und Number.isInteger immer true liefert.

Polyfill

Die isSafeInteger-Methode des Number-Objekts wurde mit ECMAScript 2015 (ES6) eingeführt. Wenn Sie ältere Browser unterstützen möchten, können Sie auf einfache Weise einen Polyfill erzeugen. Da die Konstanten MAX_SAFE_INTEGER und MIN_SAFE_INTEGER mit isSafeInteger in Verbindung stehen, sollte ein Polyfill alle drei Eigenschaften bereitstellen.

Polyfill für Number.isSafeInteger sowie Number.MAX_SAFE_INTEGER und Number.MIN_SAFE_INTEGER
if (!Number.isSafeInteger) {
   Number.MAX_SAFE_INTEGER = 9007199254740991;
   Number.MIN_SAFE_INTEGER = -9007199254740991;
   Number.isSafeInteger = function(value) {
      return Number.isInteger(value) &&  Math.abs(value) <= Number.MAX_SAFE_INTEGER;
   }
}