ie Genauigkeit eines Doppel in der allgemeinen Programmierung und Ja

Ich verstehe, dass man sie aufgrund der Natur eines Floats / Double nicht für präzise wichtige Berechnungen verwenden sollte. Ich bin jedoch ein wenig verwirrt über die Einschränkungen, die sich aus gemischten Antworten auf ähnliche Fragen ergeben. Ob Floats und Doubles unabhängig von signifikanten Ziffern immer ungenau sind oder nur bis zur 16. Ziffer.

Ich habe ein paar Beispiele in Java ausgeführt,

System.out.println(Double.parseDouble("999999.9999999999"); 
// this outputs correctly w/ 16 digits
System.out.println(Double.parseDouble("9.99999999999999");
// This also outputs correctly w/ 15 digits
System.out.println(Double.parseDouble("9.999999999999999");
// But this doesn't output correctly w/ 16 digits. Outputs 9.999999999999998

Ich kann den Link zu einer anderen Antwort nicht finden, die besagt, dass Werte wie 1,98 und 2,02 auf 2,0 abgerundet werden und daher Ungenauigkeiten verursachen. Tests haben jedoch gezeigt, dass die Werte korrekt gedruckt werden. Also meine erste Frage ist, ob Floating / Double-Werte immer ungenau sind oder ob es eine Untergrenze gibt, bei der Sie sich auf die Genauigkeit verlassen können.

Meine zweite Frage bezieht sich auf die Verwendung von BigDecimal. Ich weiß, dass ich BigDecimal für präzise wichtige Berechnungen verwenden sollte. Daher sollte ich BigDecimals Methoden zum Rechnen und Vergleichen verwenden. BigDecimal enthält jedoch auch eindoubleValue() Methode, die das BigDecimal in ein Double konvertiert.Wäre es sicher für mich, einen Vergleich zwischen Doppelwerten durchzuführen, von denen ich sicher weiß, dass sie weniger als 16 Stellen haben? Es wird überhaupt keine Arithmetik mit ihnen durchgeführt, daher sollten sich die inhärenten Werte nicht geändert haben.

Ist es für mich beispielsweise sicher, Folgendes zu tun?

BigDecimal myDecimal = new BigDecimal("123.456");
BigDecimal myDecimal2 = new BigDecimal("234.567");
if (myDecimal.doubleValue() < myDecimal2.doubleValue()) System.out.println("myDecimal is smaller than myDecimal2");

Edit: Nachdem ich einige der Antworten auf meine eigene Antwort gelesen habe, habe ich festgestellt, dass mein Verständnis falsch ist, und habe es gelöscht. Hier sind einige Ausschnitte davon, die in Zukunft hilfreich sein könnten.

"Ein Double kann 0,1 nicht genau halten. Der nächste darstellbare Wert zu 0,1 ist 0,1000000000000000055511151231257827021181583404541015625. Java Double.toString gibt nur genügend Ziffern aus, um das Double eindeutig zu identifizieren, nicht den genauen Wert." - Patricia Shanahan

Quellen:
https: //stackoverflow.com/a/574997 - Gibt an, dass ein Double bis zu 15 Ziffern enthalten kann

Antworten auf die Frage(4)

Ihre Antwort auf die Frage