Preis auf eine Nachkomma stellen aufrunden

flutsch

Neues Mitglied
Hi bin neu hier und hoffe im richtigen Forum gepostet zu haben 😉

habe folgendes Problem:

Java:
     String editPreis(String str) {

		try {

			BigDecimal value = new BigDecimal(str);

			value = value.setScale(2, RoundingMode.HALF_UP);

			return value.toPlainString();
		}
		catch(NumberFormatException e) {

			return str;
		}
	}

das ist der Code mit dem ich auf 2 Nachkommastellen aufrunde, daraus kommen Preise wie 62.24. wie kann ich auf eine nachkomma stelle aufrunden ?

bitte um hilfe

danke schon mal vorab
 
Java:
value = value.setScale(1, RoundingMode.HALF_UP);

Hilft, wenn man sich mal die Dokumentation zu den Methoden anschaut, die man verwendet. Dann kommt man ganz schnell auch von alleine drauf.
 
Das Verhalten von HALF_UP ist etwas merkwürdig. Ich hätte früher auch erwartet das aus 63.147 63.2 wird... Ist aber leider nicht so...

Guck dir das mal an:
Java:
	public static void main(String[] args) {

		BigDecimal value1 = new BigDecimal(63.123);

		value1 = value1.setScale(1, RoundingMode.HALF_UP);

		System.out.println(value1.toPlainString());
		
		BigDecimal value2 = new BigDecimal(63.147);

		value2 = value2.setScale(1, RoundingMode.HALF_UP);
		System.out.println(value2.toPlainString());
		
		BigDecimal value3 = new BigDecimal(63.147);
		
		value3 = value3.setScale(1, RoundingMode.UP);
		System.out.println(value3.toPlainString());

	}
 
Das Verhalten von HALF_UP ist etwas merkwürdig. Ich hätte früher auch erwartet das aus 63.147 63.2 wird... Ist aber leider nicht so...

Naja, du rundest eben auf die x-te Stelle und wenn die Ziffer dahinter eine 4 ist, dann interessiert es nicht, was hinter der 4 noch kommt. Würde ich jetzt nicht so sehen, dass das merkwürdig wäre.

Hallo Gonzo17,

danke aber das habe ich bereits versucht, führt aber zu keinem anderen Ergebnis.

Das glaube ich dir jetzt nicht. Außer du hast einen wie von fassy beschriebenen Fall und erwartest etwas anderes. Ansonsten schau hier:

Java:
public class Test {
	public static void main(String[] args) {
		round(1, 65.448);
		round(2, 65.448);
		round(1, 65.49123);
		round(2, 65.4959);
	}
	
	private static void round(int scale, double d){
		BigDecimal value = new BigDecimal(d);
		System.out.println(value.setScale(scale, RoundingMode.HALF_UP));
	}
}

Die Ausgabe:

65.4
65.45
65.5
65.50

Edit:
Will man tatsächlich "von hinten" aufrunden, dh bei der hintersten Stelle anfangen und dann bis zur x-ten Stelle immer auf- bzw abrunden, dann kann man das auch ganz einfach per Rekursion machen:

Java:
private static BigDecimal round(int newScale, BigDecimal value) {
		int scale = value.scale();
		if (scale > 0 && scale > newScale) {
			return round(newScale,
					value.setScale(scale - 1, RoundingMode.HALF_UP));
		}
		return value;
	}

Aber ob das das gewünschte Verhalten ist? Kann ungewünschte Nebeneffekte nach sich ziehen. So würde zum Beispiel 10.94849 auf die erste Stelle gerundet 11.0 geben oder 10.144444449 auf die erste Stelle gerundet 10.2 :bahnhof: Deswegen wär jetzt die Frage was du genau erwartest.
 
Zuletzt bearbeitet von einem Moderator:
Naja, du rundest eben auf die x-te Stelle und wenn die Ziffer dahinter eine 4 ist, dann interessiert es nicht, was hinter der 4 noch kommt. Würde ich jetzt nicht so sehen, dass das merkwürdig wäre.

Ich sage ich möchte eine Zahl auf die x-te Stelle hinter dem Komma runden. Dann erwarte ich das von der letzten Stelle an bis zu der gewünschten Stelle gerundet wird und nicht nur die Stelle direkt hinter meiner gewünschten...

Also wen ich:

63.144449 auf die erste Stelle nach dem Komma runden will würd ich erwarten das es so läuft:
63.144449 -> 63.14445 -> 63.1445 -> 63.145 -> 63.15-> 63.2

Bei HALF_UP aber nur in Bezug zum ersten "Nachbarn" gerundet:
63.144449 -> 63.14-> 63.1

HALF_UP ist da halt ein Mode der nicht meiner Vorstellung entspricht da "Rounding mode to round towards "nearest neighbor"". Aber es gibt ja zum Glück eine Menge anderer... 😉
 
Während du geschrieben hast, hab ich gerade editiert. Ich verstehe schon was du meinst. Aber wie gesagt, da ist die Frage was er genau für ein Verhalten möchte.
 
Sorry offtopic, aber @fassy:
Ich erinner mich aus irgendeinem Grund noch, dass dein Gedankengang in meinem Mathebuch in der Schule am Rand als typischer Fehler bemerkt wurde.
Der Sinn beim Runden ist, dass man zu der Zahl hinrundet die am wenigsten weit entfernt ist (nearest neighbor). Und 0.4999 ist eben näher an 0 als an 1.
Es gibt nur einen Problemfall: 0.5. Die verschiedenen RoundingModes entscheiden auch einzig und allein was in diesem Fall passiert (immer nach 0, immer nach unten, immer zur geraden Zahl, ... runden).
Oder würdest du ernsthaft 0.45 zur 1 aufrunden? 😉

Edit: Jetzt seh ich erst Gonzos Edit 😉 Sieht aus als hätte ich die Seite lange geöffnet gehabt...
 

Zurück
Oben