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

DataView.prototype.getFloat32()

Methode

Liest 4 Bytes ab <code>byteOffset</code> eines <code>DataView</code> und gibt sie als 32-Bit-Gleitkommazahl (IEEE 754, einfache Genauigkeit) zurück.

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

Signatur

DataView.prototype.getFloat32(byteOffset, littleEndian)

Beschreibung

getFloat32() liest ab einer beliebigen Byte-Position im zugrunde liegenden ArrayBuffer (oder SharedArrayBuffer) genau 4 Bytes und interpretiert sie als Gleitkommazahl mit einfacher Genauigkeit nach IEEE 754. Das Ergebnis wird in eine normale JavaScript-number (64-Bit-Double) umgewandelt.

Die Methode eignet sich besonders zum Parsen von Binärformaten – etwa 3D-Modelle (STL, glTF-Puffer), Audio-Samples, Sensordaten, Netzwerkprotokolle über WebSocket oder WebRTC oder eigene Dateiformate. Anders als ein Float32Array kann ein DataView an beliebigen, auch nicht ausgerichteten Offsets lesen und die Byte-Reihenfolge (Endianness) pro Aufruf festlegen.

Wichtig: Ohne zweites Argument liest getFloat32() in Big-Endian-Reihenfolge. Die meisten Dateiformate und praktisch alle heutigen CPUs nutzen dagegen Little-Endian – in diesem Fall muss littleEndian auf true gesetzt werden.

Parameter

Name Typ Default Beschreibung
$byteOffset Pflicht number Position in Bytes, gemessen vom Anfang des DataView (nicht des Puffers), ab der gelesen wird. Muss so gewählt sein, dass byteOffset + 4 <= view.byteLength gilt.
$littleEndian boolean false true liest im Little-Endian-Format, false bzw. weggelassen im Big-Endian-Format.

Rückgabewert

Typ
number
Beschreibung
Die gelesene 32-Bit-Gleitkommazahl als JavaScript-number. Kann auch NaN, Infinity, -Infinity oder -0 sein.

Beispiele

Wert schreiben und wieder auslesen

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

view.setFloat32(0, 0.1);
// Beim Lesen merkt man den Genauigkeitsverlust von 32 Bit
console.log(view.getFloat32(0));
console.log(view.getFloat32(0) === Math.fround(0.1));
0.10000000149011612 true

Endianness entscheidet über das Ergebnis

// Bytes von 1.0 im Little-Endian-Format
const bytes = new Uint8Array([0x00, 0x00, 0x80, 0x3f]);
const view = new DataView(bytes.buffer);

console.log(view.getFloat32(0, true));  // Little-Endian: richtig
console.log(view.getFloat32(0));        // Big-Endian (Standard): falsch interpretiert
1 ≈ 4.6e-41 (winzige subnormale Zahl)

Vertex-Daten (x, y, z) aus einem Binärpuffer lesen

// Simuliert einen Binärpuffer: 4-Byte-Header + 2 Vertices à 3 Floats
const buffer = new ArrayBuffer(4 + 2 * 12);
const writer = new DataView(buffer);
writer.setUint32(0, 2, true); // Anzahl der Vertices
[1.5, -2, 3.25, 0, 10, -0.5].forEach((v, i) => writer.setFloat32(4 + i * 4, v, true));

const readVertices = (buf) => {
  const view = new DataView(buf);
  const count = view.getUint32(0, true);
  const vertices = [];
  for (let i = 0; i < count; i++) {
    const offset = 4 + i * 12; // Stride: 3 × 4 Bytes
    vertices.push({
      x: view.getFloat32(offset, true),
      y: view.getFloat32(offset + 4, true),
      z: view.getFloat32(offset + 8, true),
    });
  }
  return vertices;
};

console.log(readVertices(buffer));
[ { x: 1.5, y: -2, z: 3.25 }, { x: 0, y: 10, z: -0.5 } ]

Fehler bei Lesezugriff außerhalb des Puffers abfangen

const view = new DataView(new ArrayBuffer(6));

try {
  view.getFloat32(3); // bräuchte Bytes 3–6, Puffer hat nur 0–5
} catch (err) {
  console.log(err.name);
}
RangeError

// Wichtig · Fallstricke

  • Standard ist Big-Endian: Ohne littleEndian = true liest die Methode Big-Endian. Ein Float32Array verwendet dagegen die Byte-Reihenfolge der Plattform (fast immer Little-Endian). Das ist eine häufige Fehlerquelle beim Parsen von Dateien.
  • Genauigkeit: Float32 hat nur etwa 7 signifikante Dezimalstellen. Werte wie 0.1 kommen nach einem Hin- und Rückweg als 0.10000000149011612 zurück. Für Vergleiche Math.fround() verwenden.
  • RangeError, wenn byteOffset negativ ist oder byteOffset + 4 größer als byteLength des Views ist. Nicht ganzzahlige Offsets werden abgeschnitten.
  • TypeError, wenn der zugrunde liegende ArrayBuffer abgetrennt wurde (etwa nach postMessage mit Transfer oder ArrayBuffer.prototype.transfer()).
  • Nicht ausgerichtete Offsets (z. B. 1 oder 3) sind erlaubt – ein Vorteil gegenüber Float32Array, das ausgerichtete Offsets verlangt.
  • NaN-Bitmuster (Payload) bleiben beim Lesen nicht garantiert erhalten.
  • Für Gleitkommazahlen mit halber Genauigkeit gibt es getFloat16() (ES2025, noch nicht in allen Umgebungen verfügbar).