Konvertieren von double zu lange Runde ohne Java
Ich versuche zu konvertieren, eine zufällige double zu lange ohne Rundung oder abschneiden.
Zunächst ändere ich den double in einen string, um zu wissen, wie viele Nachkommastellen es gibt und dann ändere ich den Wert auf lange.
Mein problem ist, dass die Zahl der in den letzten Dezimalstelle ist nicht immer richtig und ich weiß nicht, der Grund und wie kann ich es ändern.
Hier ist der code:
double z=(double) myRandom(1, 20);
long test;
String s = Double.toString(z);
test=(long) (Math.pow(10, s.length()-s.indexOf(".")-1)*z);
System.out.println("z: "+z);
System.out.println("double converted to long: "+test);
- Und das ist die Ausgabe:
d: 19.625014811604743
double umgewandelt zu lange: 19625014811604744
d: 9.143326452202839
double umgewandelt zu lange: 9143326452202838
d: 5.8964228376511105
double umgewandelt zu lange: 58964228376511104
d: 15.045936360299917
double umgewandelt zu lange: 15045936360299918
d: 14.147950026532694
double umgewandelt zu lange: 14147950026532694
Double.toString(double)
nicht unbedingt Ausgabe, was man erwarten könnte von blind drucken jede Ziffer des gleichen double
. Es hat einige Magie, um zu versuchen, um loszuwerden, funky wiederholen-stellige binärdarstellungen.Floating-point-Rundungsfehler. Warum nimmst du nicht einfach den string, den Sie haben, ersetzen
"."
mit ""
, und dann analysieren, dass in einer long
? Oder Sie gehen konnte, Doppel -> BigDecimal -> (mehrere BigDecimal durch den entsprechenden Faktor 10) -> BigInteger. Das funktioniert auch, wenn Sie Ihre code-änderungen zu erlauben, riesige Doppelzimmer.Warum tun Sie kümmern sich um die Genauigkeit auf 16 stellen eine zufällige Zahl?
Yup, ich habe eine Antwort mit, dass vor ein paar Minuten. Ich wurde nur darauf hin, dass es gut von der OP nicht nur Schultern zucken und sagen "eh, gut genug" aber eigentlich Fragen, warum es passiert.
InformationsquelleAutor user2661808 | 2013-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bearbeitung Ihrer aktuellen Umsetzung:
Oder wenn Sie wollen einfach nur eine zufällige
Long
ich würde empfehlen, mitRandom.nextLong()
statt.String s = z + "";
überString s = Double.toString(z)
?Ohne Grund. Das war schon immer meine bevorzugte Art zu konvertieren
String
in Java, aber mitDouble.toString
würde genauso gut funktionieren.Nur ein fyi, sollten Sie Doppelte.toString()... String s = z + ""; erstellt ein temp-string, während toString() nicht.
ist
""
den temp-string sprechen Sie?Ich glaube "" erhält entnommen aus dem string-pool, aber z wird umgewandelt in einen string mit String.valueOf und dann legen Sie eine weitere Zeichenfolge durch hinzufügen der Zeichenfolge.valueOf(z)"";
InformationsquelleAutor gr3co
Wenn Ihr Ziel ist, erhalten einen zufälligen long-Wert, dann würde ich dringend empfehlen die Verwendung von Random.nextLong() statt.
InformationsquelleAutor Andrei Juan
Ist, vermasselt Ihr Doppel in der Arithmetik, probieren Sie etwas wie dieses:
InformationsquelleAutor Grammin
Können Sie so etwas tun...
InformationsquelleAutor J.P. Armstrong
Die anderen Antworten haben darauf hingewiesen, wie Sie diese beheben können, aber Ihre andere Frage war warum es passiert. Die Antwort ist die floating-point-Fehler.
Floating-point-zahlen bestehen aus drei teilen: einem Vorzeichen (+ oder -), einer Mantisse und einem Exponenten. Im wesentlichen, die Zahl wird dargestellt als im wesentlichen
(sign) (mantissa) * 2^(exponent)
(aber nicht genau -- siehe links unten). Wie Sie sich vorstellen können, nicht alle zahlen passen genau in dieser Darstellung, einige haben angenähert werden. Das beste Beispiel ist ein Zehntel, die in binären hat eine unendliche Wiederholung, und so hat angenähert werden im Doppel.Bei hohen Werten-jene, die größer als die Mantisse kann represnt-es gibt einige ganze zahlen, die nicht exakt dargestellt werden. Dies geschieht auf 2^53; jede Zahl, die größer als dieser hat angenähert werden, und die zahlen, die Sie erwähnen, sind solche Beispiele.
Brauchen Sie nicht einmal
Math.pow
um dies zu demonstrieren; Literale tun gut.Diese drucken:
Beachten Sie die 4 am Ende der zweiten Wert. 19625014811604744 ist die nächste Zahl zu 19625014811604743, der dargestellt werden kann als ein Doppel.
Verwandte Lesen:
InformationsquelleAutor yshavit