2016-06-13 6 views
1

Zum Beispiel, wenn ich 3.333 habe und wenn dieser Code ausgeführt wird, brauche ich die Nummer 3.33.Wie kann ich die letzte Ziffer einer Dezimalzahl in Java entfernen?

Dies ist der Code, den ich habe, die das tun sollte, aber nicht:

String number = Double.toString(first); 
number = number.substring(0, string.length() - 1); 
first = Double.parseDouble(number); 

ich es versucht zu tun, indem Sie die Zahl in einen String konvertieren, letzte Zeichen abgeschnitten und in eine Doppelspar nochmal. Aber es funktioniert nicht. Statt 1 Ziffer abzuschneiden, schneidet es 2 ab, zum Beispiel würde es oberhalb 3,3 zurückgeben.

Ist diese Methode zuverlässig und wenn ja, was kann ich tun, um sie zu beheben?

Gibt es auch eine Chance für diese Methode, das Programm zum Absturz zu bringen (nur Dezimalzahlen gehen durch diesen Code) und würde es einen Verlust an Genauigkeit geben?

+0

Ich empfehle BigDecimal anstelle von Doppel –

+0

warum? Ich sehe keinen Grund dafür – loonytune

+3

String verfügt über einen Formatierer, um die Zeichenfolge an die gewünschte Genauigkeit zu formatieren. Sie müssen es in einer Zeichenfolge drucken, um die gewünschte Genauigkeit zu erzielen. Aber konvertiere nicht zu String und dann zurück zu Double. Hier ist die [API für String.Format] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format (java.lang.String,% 20java.lang.Objekt ...)) – Frecklefoot

Antwort

1

Wenn Sie immer die gleiche Anzahl von Dezimalstellen wie weit die beste Lösung wollen, wie ich weiß, ist diese:

DecimalFormat df = new DecimalFormat("#.00"); 

String formatedNumber = df.format(number); 
1

try this:

double d = 3.333; 
String str = String.format("%1.2f", d); 
d = Double.valueOf(str); 
System.out.println(d); 

Ausgang:

3.33

+0

oder noch mehr vereinfacht 'System.out.println (Double.valueOf (String.format ("% 1.2f ", 3.333)));' –

+0

@ Vogelscheuche- oh ja, danke, wollte er die Schritte zu verstehen. –

1

Was dazu:

double value = 3.333; 
// Multiply it by 100, convert the result into an integer to trim 
// remaining decimals then divide it by 100d to get the result as double 
double result = (int)(value * 100)/100d; 
System.out.println(result); 

Ausgang:

3,33

+0

Sie müssen es nicht komplizierter machen als 'String.format()'. – Frecklefoot

+0

Okay, ich ziehe meinen vorherigen Einwand zurück. Ihre Antwort ist sehr kreativ und korrekt. – Frecklefoot

-1

Das Hauptproblem mit dem, was Sie erreichen wollen, ist, dass Double s sind immer 64 Bits an Informationen. Sie sollen so genau wie möglich sein, während sie abstrakte/irrationale Werte darstellen und nicht dazu bestimmt sind, in Bezug auf diese Genauigkeit manipuliert zu werden. Sie können nicht für exakte Werte vertraut werden (der Eingabewert 1 könnte als 0.99999999998 enden, wenn er als Double oder etwas in diesem Sinne gespeichert wird). Wenn Sie eine genaue Zahl wünschen, sollten Sie in Betracht ziehen, int s zu verwenden (dh Sie könnten ein Bruchobjekt erstellen, das einen Zähler und einen Nenner enthält). Die einzige Zeit, die Sie ein Doppel schneiden sollten, ist zum Drucken, und das kann nur wirklich mit einer String Darstellung getan werden, wie Sie oben getan haben.

+0

Er fragt nicht nach Runden, nur letzte Ziffern abschneiden. 'String.format()' kann diese Aufgabe bewältigen und wird für diesen Problemtyp _precise_ bereitgestellt. – Frecklefoot

+0

Ihre String-Rundungstechnik ist in Ordnung ... das ist überhaupt kein String-Problem, es ist ein Wertproblem, da es ein fundamentales Missverständnis von Fließkommazahlen gibt. Sie verwenden 'Double.parseDouble()' und hoffen, eine Zahl auf eine Dezimalstelle gerundet zu bekommen. Warum würdest du meine Antwort ablehnen, ohne die Frage zu lesen? Es gibt keine richtige Antwort auf diese Frage, es ist nur eine irreführende Frage und eine Gelegenheit zu lernen. –

+0

Ich nehme deine Antwort "es gibt keine richtige Antwort" zu Herzen. Aber ich glaube, du hast es komplizierter gemacht, als es sein musste. Aber ich denke, Ihre Lösung mag funktionieren, aber ich würde es nicht so angehen. – Frecklefoot

3

Verwendung String.format:

String.format("%.2f", 3.333); 

Oder BigDecimal verwenden:

new BigDecimal(3.333).setScale(2, RoundingMode.DOWN) 

setScale legt fest, wie viele Dezimalstellen Sie benötigen. Sie können später eine toString() auf dem oben genannten BigDecimal und drucken Sie es aus.

+0

Die BigDecimal-Methode ist für mich eine sehr gute Option. Verwenden Sie die BigDecimal.doubleValue() -Methode, um in Double zu transformieren – Facepalmed

Verwandte Themen