Start · Sprachen · JavaScript · Referenz · DataView.prototype.getFloat64()

DataView.prototype.getFloat64()

Methode

Liest 8 Byte ab <code>byteOffset</code> aus einem <code>DataView</code> und gibt sie als 64-Bit-Gleitkommazahl (IEEE 754, doppelte Genauigkeit) zurück.

seit JavaScript ES2015 (Baseline: alle Browser, Node.js 0.10+) Kategorie: method-property

Signatur

DataView.prototype.getFloat64(byteOffset, littleEndian)

Beschreibung

getFloat64() liest ab einer beliebigen Byte-Position im zugrunde liegenden ArrayBuffer genau 8 Byte und interpretiert sie als Gleitkommazahl mit doppelter Genauigkeit nach IEEE 754. Das ist dasselbe Format, das JavaScript intern für den Typ number verwendet. Der Wert kommt deshalb verlustfrei zurück.

Gebraucht wird die Methode vor allem beim Einlesen von Binärformaten: Netzwerkprotokolle über WebSocket, Dateiformate wie GeoTIFF, Shapefiles oder Audio-Metadaten, serialisierte Messdaten und WebAssembly-Speicher. Anders als ein Float64Array muss der Offset bei einem DataView nicht an 8 Byte ausgerichtet sein. Außerdem kannst du die Byte-Reihenfolge (Endianness) bei jedem Aufruf einzeln angeben.

Ohne zweites Argument liest die Methode in Big-Endian. Die meisten aktuellen Prozessoren (x86, ARM) und viele Dateiformate arbeiten dagegen mit Little-Endian. Gib littleEndian daher immer ausdrücklich an, damit du nicht versehentlich falsche Werte liest.

Parameter

Name Typ Default Beschreibung
$byteOffset Pflicht number Position in Byte, gezählt vom Anfang der View (nicht des Buffers), ab der gelesen wird. Wird in eine ganze Zahl umgewandelt. byteOffset + 8 darf byteLength nicht überschreiten.
$littleEndian boolean false true liest in Little-Endian, false oder weggelassen in Big-Endian.

Rückgabewert

Typ
number
Beschreibung
Die gelesene 64-Bit-Gleitkommazahl. Das kann jede beliebige number sein, auch NaN, Infinity, -Infinity oder -0.

Beispiele

Wert schreiben und wieder lesen

const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);

view.setFloat64(0, Math.PI);
console.log(view.getFloat64(0));
3.141592653589793

Auswirkung der Byte-Reihenfolge

const view = new DataView(new ArrayBuffer(8));
view.setFloat64(0, 1.5, true); // als Little-Endian geschrieben

console.log(view.getFloat64(0, true));  // richtig gelesen
console.log(view.getFloat64(0));        // falsch: als Big-Endian gelesen
1.5 3.03865e-319

GPS-Koordinaten aus einem Binärpaket lesen

// Paketaufbau: [uint8 Typ][float64 Breite][float64 Länge], Little-Endian
const parsePosition = (arrayBuffer) => {
  const view = new DataView(arrayBuffer);
  return {
    type: view.getUint8(0),
    lat: view.getFloat64(1, true), // nicht ausgerichteter Offset ist erlaubt
    lon: view.getFloat64(9, true),
  };
};

// Testdaten erzeugen
const buf = new ArrayBuffer(17);
const w = new DataView(buf);
w.setUint8(0, 2);
w.setFloat64(1, 52.520008, true);
w.setFloat64(9, 13.404954, true);

console.log(parsePosition(buf));
{ type: 2, lat: 52.520008, lon: 13.404954 }

Datei per fetch laden und Messwerte auslesen

const readSamples = async (url) => {
  const response = await fetch(url);
  const view = new DataView(await response.arrayBuffer());
  const samples = [];
  for (let offset = 0; offset + 8 <= view.byteLength; offset += 8) {
    samples.push(view.getFloat64(offset, true));
  }
  return samples;
};

readSamples('/daten/messung.bin').then((s) => console.log(s.length, 'Werte'));

// Wichtig · Fallstricke

  • Big-Endian ist die Voreinstellung: Wer littleEndian weglässt, liest Little-Endian-Daten falsch, und zwar ohne Fehlermeldung. Es kommen einfach unsinnige Werte heraus.
  • RangeError: Die Methode wirft einen RangeError, wenn byteOffset negativ ist oder byteOffset + 8 > byteLength gilt. Prüfe die Länge vor dem Lesen, gerade bei Daten aus dem Netzwerk.
  • Der Offset gilt relativ zur View, nicht zum Buffer. Wurde die View mit new DataView(buf, 16) erzeugt, dann entspricht getFloat64(0) dem Byte 16 im Buffer.
  • TypeError: Die Methode wirft einen TypeError, wenn der ArrayBuffer abgekoppelt (detached) ist, etwa nach einer Übertragung mit postMessage oder nach transfer().
  • Das Bitmuster von NaN (sein Nutzinhalt) bleibt beim Lesen nicht unbedingt erhalten.
  • Für große, ausgerichtete Datenmengen in der Byte-Reihenfolge des Rechners ist ein Float64Array meist schneller.
  • Kompatibilität: Die Methode wird von allen aktuellen Browsern und von Node.js unterstützt. Sie funktioniert auch mit SharedArrayBuffer.