Ich habe eine double
Variable d = 1.15
.
Ich möchte die Zahl nach dem Dezimalpunkt, d. h. "15".
Was ist der beste Weg, um dies in Java zu erreichen?
Ich habe es so versucht:
Aber ich habe die richtige Antwort nicht erhalten, denn wenn ich d.toString()
umwandle, lautet die Antwort 14.999999999999986
.
Bitte helfen Sie. Danke.
Versuchen Sie Math.floor ();
%Vor%Um Rundungsfehler zu vermeiden, könnten Sie sie in BigDecimal
umwandeln %Vor%Druckt 0,2400
Beachten Sie, dass die 4 in setScale die Anzahl der Ziffern nach dem Dezimaltrennzeichen ('.')
istUm den Rest als Integer-Wert zu haben, könnten Sie dies zu
ändern %Vor%Druckt 24
Die Zahl hinter dem Komma ist kein gut definiertes Konzept. Zum Beispiel für "4.24" könnte es "0.24", "0.2399999999999" (oder ähnlich), "24" oder "239999999999" sein.
Sie müssen klar sein, wenn Sie über eine Zahl oder eine Folge von Dezimalziffern sprechen ... und ob der Eingabewert eine Darstellung einer binären Gleitkommazahl ist (in diesem Fall ist "4.24" höchstwahrscheinlich eine Annäherung) ) eine dezimale Gleitkommazahl.
Abhängig von Ihrer Interpretation wird die richtige Antwort anders sein.
Aber ich habe die richtige Antwort nicht bekommen, denn wenn ich d.toString () konvertiert habe, lautet die Antwort 14.999999999999986.
Sie stoßen auf das Problem, dass double
und float
Basis-2-Gleitkommaformate sind, und in den meisten Fällen können sie KEINE dezimalen Gleitkommazahlen darstellen. Es gibt keine Lösung dafür ... außer etwas wie BigDecimal
zu verwenden, um deine Zahlen darzustellen. (Und selbst dann ist ein gewisser Genauigkeitsverlust möglich, wenn Sie eine Divisions- oder Modulo-Operation durchführen.)
Wenn Sie die Dezimalstellen möchten und das Ergebnis runden möchten.
%Vor%druckt
%Vor%Wenn Sie einen gerundeten Wert wünschen, müssen Sie bestimmen, welche Genauigkeit Sie wünschen.
%Vor%Wie in jeder anderen Sprache: multipliziere mit 10 und überprüfe den int-Teil des Rests, wenn du durch 10 dividierst. Genau so würdest du Zahlen aus einer ganzen Zahl extrahieren.
%Vor%Beachten Sie jedoch, dass Sie für das Doppelte ein Genauigkeitslimit einführen müssen - die maximale Anzahl der zu extrahierenden Ziffern (max_len aus dem obigen Codebeispiel).
Geringfügige Aktualisierung (zusätzliche Rundung am Rand der Genauigkeit):
%Vor%Tags und Links java