Runden von Double Werten

Hi zusammen,

ich versuche Werte zu Runden nach der Schweizer Währung ( xxxx . x 0 || 5).

Bisher bin ich aber leider erfolglos :(

folgendes habe ich versucht:

Java:
public class Currency {
    public static double round(String chf, double value) {

        double v = 0;
        int vInt = 0;

        if (chf.toLowerCase().equals("chf")) {

//            double roundOff = Math.round(value * 100.0) / 100.0;
            v = Math.round(100.0 * value) / 100.0;
//            v = value * 100;
//            vInt = (int) v;
//            v = vInt / 100;
            v = roundValueWithPrecision(v, 0.05);
            double newVal = Math.round(100.0 * v) / 100;
//            v = roundValueWithPrecision(v, 0.05);
//            v = Math.round(100.0 * v) / 100;
//            v = Math.round((v * 100) / 100.0);

            return newVal;
        }
        return v;
    }

    private static double roundValueWithPrecision(double value, double precision) {

        double scaled = value / precision;
        scaled = Math.round(scaled);
//        scaled = Math.round(100.0 * scaled) / 100;
        return scaled * precision;
    }

}
Beachtet bitte, dass da einiges auskommentiert ist, da ich versuche darzustellen was ich alles versucht habe.

Der Value den ich zum Testen nutze ist aktuell: "52296.61000000001".

Dabei sollte der erwartete Wert sein: "52296.60"

Habt ihr Vorschläge?

Gruss
 
@cyb0rg Mit einem double wirst Du Dich auch schwer tun, da es sich um eine binäre Fließkommazahl handelt, mit der sich bestimmte Dezimalzahlen nicht exakt darstellen lassen (das ist analog zur Darstellung von z. B. 1/3 im Dezimalsystem).

Entweder Du rundest bei der Ausgabe (s. Vorschlag von @Tobias-nrw) oder Du verwendest eine andere Darstellung, z. B. könntest Du nicht mit Franken sondern mit Rappen (ganzzahlig) rechnen und dann auf ganze Rappen runden. Andere Möglichkeit wäre, eine Klasse wie BigDecimal oder spezielle Klassen, wie z. B. in JSR-354 spezifiziert, zu verwenden.
 
Vielen dank ihr zwei für die Vorschläge..

@Tobias-nrw:
NumberFormat kennt die Locale "ch" nicht.
entsprechend wird nicht aufgerundet, zwar rundet es auf 2 stellen nach dem komma ab, aber falsch gerundet.

DecimalFormat muss ich noch testen.

@mihe7
stimmt an rappen umzurechnen und dann zurück hatte ich bisher noch nicht gedacht.. muss ich mal schauen.
 
NumberFormat kennt die Locale "ch" nicht.
Java:
public class Test {
    public static void main(String[] args) {
        Locale switzerland = new Locale("de", "CH");

        NumberFormat nf = NumberFormat.getCurrencyInstance(switzerland);
        double value = 52296.61000000001;
        System.out.println(nf.format(value));
    }
}
 
wieso soll das nicht auf x.61 abgerundet werden?
weil es den Betrag von x.61 nicht gibt.

"
Der Value den ich zum Testen nutze ist aktuell: "52296.61000000001".

Dabei sollte der erwartete Wert sein: "52296.60"

es gibt nur die Schritte 0 und 5 also entweder es müsste 60 oder 65 sein. seit 2007 gibt es die Cents also 1ner schritte nicht mehr.

Entsprechend ist es falsch gerundet.
 
Ich wage zu behaupten, dass es auch in der Schweiz 61 Rappen gibt, gerundet auf 5 wird doch nur beim Bezahlen?
sagen wir mal so :)
du kannst auf dem Konto Sfr. 10.61 haben.
du kannst aber nur Sfr. 10.60 abheben.
dann hast du noch Sfr. 0.01 auf dem Konto, kannst aber nix damit anfangen da die kleinst möglich begleichbare Rechnung (abgesehen von 0.00 für Kostenlos) entspricht 0.05.
Entsprechend werden meines Wissens nach nur Rechnung gestellt die gerundet sind mit 5 Rappen. Alles andere macht denke ich keinen Sinn (ich selbst habe seit vielen Jahren nie Rechnungen oder Transaktionen gesehen die nicht gerundet waren auf 5 Rappen. Gilt übrigens auch für die ERP Systeme die ich gesehen habe, zwar lediglich 3 die ich kenne aber... ich wage zu bezweifeln dass es einen nachvollziehbaren Grund gibt um Rappen digital zu beheimaten.
btw... bevor die Frage aufkommt, was passiert, wenn man Sfr. 10.64 auf dem Konto hat, ob da auch 10.65 abgehoben werden können und dann ist man auf 0 oder -0.01 auf dem Konto... weiss ich nicht :) die situation hatte ich noch nie.
 
weil es den Betrag von x.61 nicht gibt.
Runden auf andere Werte musst Du schon selbst :) Es geht bei der Formatierung darum, dass bis zur niederwertigsten Stelle richtig ausgegeben wird.

 
Na dann halt so:
Java:
    String getRounded(double d) {
        d = d * 10;
        d = Math.round(d * 2) / 2.0;
        NumberFormat f = NumberFormat.getCurrencyInstance(new Locale("de", "CH"));
        return f.format(d / 10);
    }

    public static void main(String[] args) {

        System.out.println(new Spiel().getRounded(52296.61000000001));
        for (int i = 0; i <= 10; i++) {
            System.out.println(new Spiel().getRounded(11.1 + (0.01 * i)));
        }

    }

Ich bin immernoch schockiert das es die Schweiz angeblich nicht geben soll. :eek:
 
Na dann halt so:
Java:
    String getRounded(double d) {
        d = d * 10;
        d = Math.round(d * 2) / 2.0;
        NumberFormat f = NumberFormat.getCurrencyInstance(new Locale("de", "CH"));
        return f.format(d / 10);
    }

    public static void main(String[] args) {

        System.out.println(new Spiel().getRounded(52296.61000000001));
        for (int i = 0; i <= 10; i++) {
            System.out.println(new Spiel().getRounded(11.1 + (0.01 * i)));
        }

    }
cool das läuft! danke!

Ich bin immernoch schockiert das es die Schweiz angeblich nicht geben soll. :eek:
ja ich auch :)
 
CHF 1.15 kommt da raus. Es gibt unterschiedliche Rundungsmodelle (abrunden, aufrunden usw.)
Aus "sicherer Quelle" :D weiß ich dass den Banken aufgerundete Cent- oder Rappenbeträge auch egal wären...

Aber wie kann xx5 gerundet werden? Das ist so ähnlich wie die Frage ob meine Kaffeetasse noch halbvoll oder schon halb leer ist...
 
Passende Stellenanzeigen aus deiner Region:

Oben