Heim >Java >javaLernprogramm >Rundungsfehler in Java
Beim Schreiben von Codes machen wir alle verschiedene Fehler, die zu Fehlern wie Überlauffehlern und Syntaxfehlern führen. Dies ist einer der häufigsten Fehler, die zu einer falschen Lösung für ein bestimmtes mathematisches Problem führen können Fehler tritt auf, wenn wir mit Gleitkommazahlen arbeiten.
In diesem Artikel werden wir die Ursachen dieses Problems untersuchen und versuchen, einen Weg zu finden, diesen Fehler zu beheben.
Sie werden auch reelle Zahlen genannt und werden verwendet, wenn Berechnungen Bruchwerte erfordern. Es stellt eine Zahl mit einem Dezimalpunkt dar. Um beispielsweise das Ergebnis von 1/5 auszudrücken, also 0,2, ist für die Ergebnisse von Sinus und Cosinus auch ein Dezimalpunkt erforderlich.
In Java gibt es zwei Arten von Gleitkommazahlen -
Gleitkommazahl – Es können Werte mit einfacher Genauigkeit bis zu 32 Bit gespeichert werden. Wir deklarieren es mit dem Schlüsselwort „float“.
Double − Seine Größe ist größer als Float und kann Werte mit doppelter Genauigkeit bis zu 64 Bit speichern. Es wird mit dem Schlüsselwort „double“ deklariert.
Lassen Sie uns ein Beispiel besprechen, bei dem ein Rundungsfehler auftreten kann. Anschließend werden wir den Grund verstehen und eine Lösung für den korrekten Umgang damit anbieten.
public class Main{ public static void main(String[] args) { double data1 = 0.30; double data2 = 0.20 + 0.10; System.out.println("Value after addition: " + data2); System.out.println(data1 == data2); double data3 = 0.50; double data4 = 0.10 + 0.10 + 0.10 + 0.10 + 0.10; System.out.println("Value after addition: " + data4); System.out.println(data3 == data4); } }
Value after addition: 0.30000000000000004 false Value after addition: 0.5 true
Wenn wir den obigen Code zum ersten Mal hinzufügen, beträgt der erwartete Wert von „data2“ 0,30, aber das Ausgabeergebnis ist falsch. Wenn wir jedoch eine weitere ähnliche Additionsoperation durchführen, erhalten wir das genaue Ergebnis.
Nehmen wir ein weiteres Beispiel, das einen Fehler anzeigt.
Die chinesische Übersetzung vonpublic class Main { public static void main(String[] args) { double data1 = 4.30452; double data2 = 0.503542; double res = data1 + data2; System.out.println("Value after addition: " + res); } }
Value after addition: 4.8080620000000005
Die erwartete Ausgabe ist 4,808062, aber wir erhalten hier eine falsche Ausgabe.
Der „IEEE 754“ ist ein Standard, der von Java bei der Implementierung von Gleitkommazahlen befolgt wird. Wenn der Wert der Mantisse größer als 23 Bit ist, wird 1 zum 23. Bit addiert, um den Wert zu runden . Hier ist die Mantisse die binäre Darstellung von Nachkommastellen.
Deshalb erhalten wir unterschiedliche Werte.
Um diesen Rundungsfehler zu vermeiden, haben wir die folgenden Methoden -
BigDecimal – Es handelt sich um eine Klasse, die anstelle von Gleitkommazahlen wie Float und Double verwendet werden kann. Wir können alle normalen Operationen ausführen, die Float- und Double-Datentypen bieten, zum Beispiel arithmetische Operationen, Vergleiche und Rundungen. Es kann diese Vorgänge mit präziser Präzision ausführen.
Das folgende Beispiel zeigt, wie wir damit ein genaues Ergebnis erzielen können.
import java.math.*; public class Main{ public static void main(String[] args) { BigDecimal data1 = new BigDecimal("0.20"); BigDecimal data2 = new BigDecimal("0.10"); BigDecimal res = data1.add(data2); // performing addition System.out.println("Value after addition: " + res); } }
Value after addition: 0.30
In Beispiel 1 ist beim Addieren zweier Werte ein Fehler aufgetreten. Im obigen Beispiel haben wir dieselben Werte verwendet, aber dieses Mal haben wir das richtige Ergebnis erhalten.
Math.round() − Es ist eine statische Methode der Klasse „Math“. Es verwendet einen Gleitkommawert als Argument und gibt den nächstgelegenen ganzzahligen Wert zurück. Wir rufen es mit seinem Klassennamen auf.
Das folgende Beispiel veranschaulicht die Verwendung im Programm.
public class Main { public static void main(String[] args) { double data1 = 4.30452; double data2 = 0.503542; double res = data1 + data2; System.out.println("Value after addition: " + res); System.out.println("Value after rounding off the addition: " + Math.round(res)); } }
Value after addition: 4.8080620000000005 Value after rounding off the addition: 5
Rundungsfehler sind kein Kompilierungs- oder Laufzeitfehler, der Java-Compiler kann ihn nicht erkennen. Aus diesem Grund muss der Programmierer diesen Fehlern besondere Aufmerksamkeit schenken, da wir sonst das falsche Ergebnis erhalten den Grund und schlug auch einige Möglichkeiten vor, diesen Rundungsfehler zu beheben.
Das obige ist der detaillierte Inhalt vonRundungsfehler in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!