Rundungsfehler in JavaScript

Rundungsfehler in JavaScript

In JavaScript existieren Zahlen im Datentyp Number, wodurch man bei Rechenoperationen auf Rundungsprobleme stößt. Karsten Rieger, ehemaliger Professional Frontend Developer bei Neofonie, erklärt das Phänomen und stellt Lösungsansätze vor.

Wer Rechenoperationen mit JavaScript ausführen will, wird früher oder später auf ungenaue Ergebnisse stoßen.

Schauen wir uns ein Beispiel genauer an:

var result = 0.1 + 0.2;

result === 0.3

// false !

// result == 0.30000000000000004

Um zu verstehen, warum das so ist, muss man wissen, wie Zahlen in JavaScript verwaltet werden.

Der Datentyp Number

In JavaScript existiert für Zahlen nur ein Datentyp: Number.

Number ist ein 64Bit Floatingpoint  Datentyp. Diese 64 Bit werden dabei entsprechend dem Standard IEEE 754 (bzw. double precision binary floating point format) so aufgeteilt, dass die Bits 0 bis 51 für die Mantisse (den eigentlichen Zahlenwert), die Bits 52 bis 62 für den Exponenten und das letzte Bit (63) für das Vorzeichen verwendet werden.
Jede Zahl wird also in einer binären Exponential-Repräsentation abgebildet. Für Ganzzahlwerte bedeutet dies, dass eine gesicherte Darstellung bis 15 Ziffern möglich ist, bevor Rundungsfehler bedingt durch die exponentielle Abbildung auftreten.

Integer sind bis 15 Stellen sicher

var x = 999999999999999;   // 999999999999999

var y = 9999999999999999;  // 10000000000000000

Bei Fließkommazahlen wirkt sich dies entsprechend auf die Genauigkeit der Nachkommastellen aus (s. erstes Beispiel).

JavaScript steht nicht allein da

Wer sich nun bestätigt darin fühlt, dass JavaScript eine total verkorkste Sprache sei und nicht einmal ordentlich rechnen kann, wird erstaunt sein, dass dieses Problem nicht allein auf JavaScript beschränkt ist. Alle Sprachen, welche Fließkommazahlen nach IEEE 754 implementieren, weisen entsprechende Rundungsfehler auf. Der Unterschied besteht lediglich in den diversen Sprachen sich unterscheidenden zusätzlichen Datentypen.

Wer es nicht glaubt, kann gerne einmal in groovy (bzw. Java) folgendes ausprobieren:

Rundungsproblem in Java/Groovy

println"0.1 + 0.2 = ${0.1 + 0.2}"// "0.1 + 0.2 = 0.3"

println"0.1f + 0.2f = ${0.1f + 0.2f}"// "0.1f + 0.2f = 0.30000000447034836"

println"0.1d + 0.2d = ${0.1d + 0.2d}"// "0.1d + 0.2d = 0.30000000000000004"

Daran lässt sich auch gut erkennen, dass Number dem Datentyp Double in Java entspricht.

Eine Anekdote am Rande

Wem das alles nun viel zu kompliziert erscheint, der ist an dieser Stelle sicher nicht alleine. Wichtig ist es zu wissen, dass Rundungsfehler aufgrund der Abbildung entstehen können.

Selbst ein so genialer Kopf wie Steve Wozniak hat es vermieden einen Floatingpoint Datentyp in Apples erstem Basic zu implementieren. Laut Wikipedia war Wozniak zu sehr mit der Entwicklung des Diskettenlaufwerks beschäftigt, weshalb Microsoft  beauftragt wurde ein Basic mit Fließkommazahlen zu entwickeln (später genannt Applesoft Basic).

Sicher hätte Wozniak die intellektuellen Kapazitäten dazu gehabt, das Problem zügig zu lösen. Witzig ist jedoch, dass es nie eine offizielle Begründung gab, warum Wozniak damals keine Fließkommazahlen in Apple Basic umgesetzt hat. Während eines Interviews bei All Things Digital (2007) sagt Jobs auf die Frage, warum Wozniak keine Fließkommazahlen in Apple Basic umsetzte, lediglich: „This is one of the mysteries of life“.

Wie vermeidet man Rundungsfehler?

Ist man gezwungen mit großen Zahlen innerhalb von JavaScript zu rechen und sucht etwas analoges zu Javas BigDecimal, sollte man sich vielleicht bignumber.js oder BigDecimal.js einmal anschauen.

Für den gewöhnlichen Gebrauch genügt es jedoch meist, sich auf drei bis vier Stellen nach dem Komma zu beschränken und die nativen Methoden numObj .toPrecisionStelligkeit ) oder numObj .toFixedNachkommastellen ) zu verwenden. Der Unterschied zwischen beiden ist, dass man bei toPrecision() die Gesamtanzahl der darzustellenden Ziffern (Vorkomma + Nachkomma) angibt, während man bei toFixed() die Anzahl der darzustellenden Nachkommastellen angibt.

var result = parseFloat((0.1+ 0.2).toPrecision(1));

result === 0.3

// true

Zu beachten sei noch, dass sowohl .toFixed() als auch .toPrecision() als Rückgabewert kein Numberobjekt sondern einen String liefern, weshalb in dem oberen Beispiel auch noch einmal ein parseFloat() nötig ist, um auch einem Typvergleich (===) standzuhalten.

Neben einer Berechnung wie zuvor gesehen, ist auch bei der Übertragung von Zahlen darauf zu achten, ob diese eventuell implizit zu Number konvertiert werden. So interpretiert beispielsweise jQuery.data() den im Data-Attribut des angefragten Elements enthaltenen Wert. Ist dieser ein Zahlen wert, wird dieser entsprechend als Number zurückgegeben. Dies ist solange kein Problem, wie der Wertebereich Double eingehalten wird. Oft werden jedoch IDs auf diese Weise übertragen, welche wiederum gerne Long Werte sind und daher auch eine Stelligkeit jenseits der gesicherten 15 Stellen erreichen können. Um eine implizite Umwandlung zu vermeiden, sollte man daher auf das Data-Attribut, welches einen Long-Wert enthält zur Sicherheit mit der Methode jQuery.attr() zugreifen, welche stets einen String zurückliefert.

Wer das Problem der Rundungsgenauigkeit beim Abbilden von Fließkommazahlen in eine binäre Exponentialdarstellung selber einmal im Code lösen möchte, kann sich ja einmal am folgenden Coding Kata versuchen: Codewars – Float to binary conversion (wenn beim ersten Pageload eine Fehlermeldung erscheint, einfach erneut ein Reload versuchen)

Der vollständige Artikel kann auf entwickler.de gelesen werden.

Veröffentlicht am 10. Dezember 2015, aktualisiert am 10. Oktober 2020

Teilen auf
Karsten Rieger

Karsten Rieger

Karsten Rieger ist ehemaliger Professional Frontend Developer bei Neofonie. Seit 2006 hat er diverse technische Abteilungen wie ASP, Forschung und Entwicklung sowie Projects bzw. Software Factories durchlaufen. Sein Interesse gilt dabei verstärkt der Frontend-Entwicklung. Als Teil des Client Teams entdeckt er bei der Umsetzung diverser Kundenprojekte, dass hinter Frontend-Entwicklung mehr als „nur ein bisschen HTML und CSS“ steckt.

ontolux bei der Buzzwords 2022

Qi Wu von der KI-Agentur ontolux stellt Methoden zur Ressourceneinsparung von KI-Modellen mittels Knowledge Destillation in ihrem Vortrag bei der Buzzwords 2022 in Berlin vor. Die Buzzwords Berlin konzentriert sich auf Themen wie Open-Source-Softwareprojekte, Suche, Speicherung, Streaming und Verarbeitung von großen Datenmengen.

Header_Vortrag_Qi Wu_ontolux_pietro Jeng-n6B49lTx7NM-unsplash_06_21

ontolux bei der Mind Mastering Machines 2022

Die Minds Mastering Machines (M3) Konferenz wendet sich an Softwareentwickler, Data Scientists und Forschende, die Machine Learning und KI-Anwendungen entwickeln. Qi Wu von der KI-Agentur ontolux stellt Methoden zur Ressourceneinsparung von KI-Modellen mittels Knowledge Destillation in einem Vortrag vor.

KIFE_042022

KI und Forschung 04-2022

Die nächste Runde der großen Machine Learning-Modelle ist eingeleitet und GPT-3 und T5 sollen in Rente geschickt werden. In der ontolux „KI und Forschung“- Reihe gibt Dr. Till Plumbaum wieder Einblicke in aktuelle KI-Themen.

Rennfahrer

Wie es B2B Webseiten gelingt, mehr Service zu bieten

Ein durchdachtes UX-Design verwandelt B2B-Websites in ein effizientes Service-Instrument. In der Marconomy gibt UX-Experte Axel Hillebrand Tipps, worauf B2B-Marketer achten sollten.

Kind und Karriere – Vereinbarkeit von Familie und Beruf bei Neofonie

Vereinbarkeit von Familie und Beruf ist für viele Eltern eine Herausforderung und erfordert familienfreundliche Unternehmenskulturen. Wie familienfreundlich ist Neofonie ? Wir haben Khayrat Glende, Head of Quality Management dazu befragt.

Entity Linking mit Doccano und TXTWerk

Zum Labeling von Entitäten hat ontolux das Open Source-Annotationstool Doccano mit der Anbindung an das hauseigene Textanalyse-Framework TXTWerk in einem Fork eingebunden, um eigene Entity Linking Annotationen zu erstellen.

Mit UX-Design die Candidate Experience optimieren

Erfahren Sie die zehn Must-Knows für ein optimales Karriereportal oder lassen Sie unsere Experten von ION ONE einen Blick auf Ihre Karriereseite werfen, um Optimierungspotenziale zu identifizieren für mehr Bewerber.

KIFE_3_2022

KI & Forschung 03-2022

Google bekommt Konkurrenz, doch bringen neue KI-gestützte Suchmaschinen wirklich eine Besserung für Nutzer? In unserer „KI und Forschung“- Reihe gibt Dr. Till Plumbaum wieder Einblick in aktuelle KI-Themen.

Viele Generationen – ein Team – Neofonie

Wir haben Joachim Schneider und Philip Kramwinkel befragt: Was eint und unterscheidet ihre Generationen und wie bereichern sie sich aus ihrer Sicht in der Zusammenarbeit bei Neofonie?

Neofonie gibt Praxistipps beim IHK Digitalisierungsforum

Um die regionale Wirtschaft bei Digitalisierungsfragen zielgerichtet unterstützen zu können, treffen sich die 79 bundesweit vertretenen Industrie und Handelskammern holen beim IHK Digitalisierungsforum in Dortmund. Neofonie ist als Partner der IHK Digital vor Ort und gibt Einblicke in die Praxis.

Neofonie ist neuer Contentful Partner

Contentful hat sich zu einem wichtigen Akteur für digital orientierte Unternehmen entwickelt, die ihre Inhalte optimal nutzen wollen, um ihren Kunden das beste digitale Erlebnis zu bieten. Neofonie nimmt Contentful in sein Partnerportfolio auf und unterstützt Unternehmen bei der Entwicklung und Implementierung.

Natural Language Processing mit dem Wikidata Knowledge Graph

Im Rahmen der Wikidata Data Reuse Days 2022 stellen Bertram Sändig und Patricia Helmich von ontolux ihre Erfahrungen vor, die sie beim Natural Language Processing mit dem Wikidata Knowledge Graph machen.

Header_KI_Forschung_ontolux_christopher-burns-Kj2SaNHG-hg-unsplash_06_21

KI & Forschung 02-2022

Wenn über künstliche Intelligenz gesprochen wird, kommen schnell auch ethische Überlegungen ins Spiel. In unserer aktuellen „KI und Forschung“- Reihe stellt Dr. Till Plumbaum die neuesten Entwicklungen zu den Themen Ethik und Bias vor.

Agile Führung – Bedeutung und Herausforderungen für Führungskräfte

Was agile Führung konkret ausmacht und welche Anforderungen an eine agile Führungskraft gestellt werden, klären wir im Interview mit Holger Paetsch – Head of Project Management bei der Digitalagentur Neofonie.

Neofonie-Mitarbeiter schauen sich Design-Entwürfe an

Wie eine Webseite zum Verkaufsinstrument wird

Erst mit einem durchdachten UX-Design verwandelt sich eine Webseite zu einem effizienten Verkaufsinstrument. Axel Hillebrand gibt fünf wesentliche Tipps.

IntelligenteSuche_Staubsauger_News

Fun: Was intelligente Suche und Staubsauger gemein haben

Angeblich stehen beutellose Staubsauger und das Thema Intelligente Suche nicht unbedingt in einem klaren inhaltlichen Zusammenhang. Warum eigentlich nicht?

TOP Arbeitgeber für IT-Jobs

Neofonie ist Top Arbeitgeber für IT-Jobs 2022

Die Zeitschrift CHIP hat zum zweiten Mal die „Top Arbeitgeber für IT-Jobs“ gekürt. Von mehr als 2.500 untersuchten Arbeitgebern konnte Neofonie überzeugen und zählt in der Softwarebranche zu den attraktivsten Arbeitgebern.

Header_KI_Forschung_ontolux_christopher-burns-Kj2SaNHG-hg-unsplash_01_22

KI & Forschung 01-2022

Dr. Till Plumbaum stellt auch 2022 die neuesten Forschungsergebnisse rund um die Themen NLP und Künstliche Intelligenz vor. In der aktuellen Januar-Ausgabe von „KI und Forschung“ geht es um Datenqualität und um die neueste Version von Lucene.

Newsbox_WomeninTech

Women in Tech bei Neofonie

Der Frauenanteil in der Neofonie liegt derzeit bei 31 Prozent, davon sind rund 25 Prozent direkt im Projektgeschäft aktiv. Diana Neufeld haben wir zum Thema Women in Tech bei Neofonie befragt.

newsbox-GWA_Win

Neofonie zählt zu den besten Web- und Online Agenturen 2022

Neofonie ist offizieller Preisträger der German Web Awards. Der Award kürt die besten Web- und Online Agenturen und zählt zu einer der wichtigsten Auszeichnungen in der DACH-Region.

Unser Newsletter „Neo Report“ vermittelt konkretes Praxiswissen, Trends und Know-how für Ihr digitales Business – quartalsweise und kompakt. Jetzt anmelden.