Geldbetrag in Euro + Cents ausgeben

Kirsche500

Mitglied
Hey, ich befasse mich erst seit kurzem mit dem Programmieren und komme bei meiner Aufgabe nicht weiter.
Ich habe jeweils den Dollarbetrag und den Centbetrag als Ganzezahl eingelesen. Im nächsten Schritt soll ich ich den Gesamtbetrag (Dollar + Cent) angeben bzw berechnen. Mir gelingt es leider nicht das der Amount wie auf dem Bild gezeigt ausgeschrieben wird. Kann mir eventuell jemand sagen wie ich das machen muss das bei Amount 983.93 rauskommt
LG

1665999115780.png
 

KonradN

Super-Moderator
Mitarbeiter
Das ist dann ja eine Fließkommazahl.
Und der Gesamtbetrag ist ja die Summe beider Beträge in Dollar.
Daher wäre dann die Frage: Wie rechnest Du Cents in Dollar um? Da wäre also die Frage, was für eine mathematische Operation Du da brauchst.
Und dann aufpassen: Wenn Du in Java mit Integer Werten rechnest, dann kommt auch immer ein Integer raus. Wenn Du da z.B. double Werte haben willst, dann muss mindestens ein Operand ein double sein!

Hilft Dir das schon, um auf die Lösung zu kommen?
 

Kirsche500

Mitglied
Das ist dann ja eine Fließkommazahl.
Und der Gesamtbetrag ist ja die Summe beider Beträge in Dollar.
Daher wäre dann die Frage: Wie rechnest Du Cents in Dollar um? Da wäre also die Frage, was für eine mathematische Operation Du da brauchst.
Und dann aufpassen: Wenn Du in Java mit Integer Werten rechnest, dann kommt auch immer ein Integer raus. Wenn Du da z.B. double Werte haben willst, dann muss mindestens ein Operand ein double sein!

Hilft Dir das schon, um auf die Lösung zu kommen?
Danke habe die Lösung gefunden :)
 

Jw456

Top Contributor
Tipp
Java:
int cent = 7;
int doller = 20;
double e =0;

e = cent*10;
e = e/100;
e = e+doller;
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Tipp
Java:
int cent = 7;
int doller = 20;
double e =0;

e = cent*10;
e = e/100;
e = e+doller;
Das ist gut - wechselst Du mir bitte etwas Kleingeld? Ich habe hier ganz ganz oft 70 Cent rumfliegen. Wäre echt super, wenn Du mir dann für jedes meiner 70 Cent dann 7 Dollar (70 * 10 / 100 ) geben würdest. (Können wir gerne auch mit Euros machen wenn es Dir lieber ist)
 

Jw456

Top Contributor
Das ist gut - wechselst Du mir bitte etwas Kleingeld? Ich habe hier ganz ganz oft 70 Cent rumfliegen. Wäre echt super, wenn Du mir dann für jedes meiner 70 Cent dann 7 Dollar (70 * 10 / 100 ) geben würdest. (Können wir gerne auch mit Euros machen wenn es Dir lieber ist)


Ok hast recht
Java:
e = cent
e = e/100;
e = e+doller;
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Wird das hier mal wieder eine "wie mache ich es möglichst kompliziert"-Challenge?

Java:
public void zeigeBetrag(int dollar, int cent) {
    System.out.print(dollar + ".");
    if (cent < 10) {
        System.out.print("0");
    }
    System.out.println(cent);
}

Das ist mir irgendwie zu einfach, das muss doch auch komplizierter gehen. Gut, Parameterprüfung bläht das schon einmal ein wenig auf, das kann man noch bitweise machen. Nicht einfach per Rechtsshift, das wäre langweilig und so Konstanten wie Integer.MIN_VALUE will ich auch nicht haben:

Java:
public void zeigeBetrag(int dollar, int cent) {
    if ((dollar & (1 << 31)) ^ (1 << 31) == 0 || (cent & (1 << 31)) ^ (1 << 31) == 0) {
        throw new IllegalArgumentException();
    }

    System.out.print(dollar + ".");
    if (cent < 10) {
        System.out.print("0");
    }
    System.out.println(cent);
}

Das gefällt mir schon besser. Die Prüfung cent < 10 stört noch ein wenig.

Java:
public void zeigeBetrag(int dollar, int cent) {
    if ((dollar & (1 << 31)) ^ (1 << 31) == 0 || (cent & (1 << 31)) ^ (1 << 31) == 0) {
        throw new IllegalArgumentException();
    }

    System.out.print(dollar + ".");
    if (cent >> 3 == 0 || (cent & 2147483632) == 0 && (cent & ((1 << 2) | (1 << 1))) == 0)  {
        System.out.print("0");
    }
    System.out.println(cent);
}

Verbesserungsvorschläge?
 

berndoa

Top Contributor
Die Lösungsideen von @httpdigest und @li-one-two haben beide das Problem, dass es bei Cent-Beträgen, die nicht zweistellig sind, falsche Werte liefert.

Also 1$ und 7 Cent sind nicht 1.7 Dollar sondern 1.07 Dollar.
Naja, dann halt beim Cent-String ne if Bedingung rein, die bei Länge 1 ein "0" davorklatscht.
Und wenn Länge mehr als 2 ist, dann entweder Alles nach den ersten 2 Stellen abschneiden.
oder als int auf 2 Stellen runden (sieht zwar nicht schön aus, aber ein easy Einzeiler).

Eigentlich wohl wirklich die simpelste Variante: Einfach Alles in Cent umwandeln, zusammenzählen und wieder in Euro umwandeln.
Zwischendurch wo nötig String->int oder int->String umwandeln (lassen). :)
 

KonradN

Super-Moderator
Mitarbeiter
Weil double böse sind und Ungenauigkeiten haben, die int nicht haben :)
Aber die Umwandlung machst du ja auch. Damit hast Du die gleiche Ungenauigkeit und bist nicht genauer.
Wenn man deutlich mehr rechnen will, dann macht ein Rechnen mit den Cent Beträgen prinzipiell Sinn, aber da gibt es dann auch andere Lösungen, die eher besser geeignet sind.

https://javamoney.github.io/ wäre z.B. eine Möglichkeit. Aber auch BigDecimal wäre eine gute Variante.
 

berndoa

Top Contributor
Aber die Umwandlung machst du ja auch. Damit hast Du die gleiche Ungenauigkeit und bist nicht genauer.
Wenn man deutlich mehr rechnen will, dann macht ein Rechnen mit den Cent Beträgen prinzipiell Sinn, aber da gibt es dann auch andere Lösungen, die eher besser geeignet sind.

https://javamoney.github.io/ wäre z.B. eine Möglichkeit. Aber auch BigDecimal wäre eine gute Variante.
Na, jetzt holen wir aber die ganz großen Geschosse raus :O

Ich meinte nur, ich erinnere mich in der Vergangneheit an was, wo ich eine simple Division machen wollte (bspw. 6.6/2) und da irgendwie 3.276435356 oder so rauskam, also völlig ungenauer Mist.
Hieß es, die double Zahlen wären einfach so schei... und ich solle besser ints nehmen.

Seitdem wandle ich Alles wo nur möglich in ints um :)
 

MarvinsDepression

Bekanntes Mitglied
double haben ihre Ungenauigkeiten doch in erster Linie durch das Runden. Die Fehler entstehen am Ende der Mantisse. das ist so die 13-15-te Kommastelle. Binär lassen sich halt viele gebrochen-rationale Zahlen nicht vollständig darstellen, welche im dezimalen System eine endliche Anzahl von Nachkommastellen haben. das fängt schon bei so scheinbar einfachen Brüchen wie 3/10 an. Das lässt sich binär nicht ohne Rundungsfehler darstellen.
 

Seymur

Mitglied
Java:
public static void main(String[] args) {

        // Scanner Methode

        Scanner sc = new Scanner(System.in);

        // Dialog zwischen User und Console

        System.out.print("Enter dollars: ");
        double euro = sc.nextInt();
        System.out.println();
        System.out.print("Enter Cents");
        double cents = sc.nextInt();

        // Formel für Cent umrechnen

        cents = cents/100;

        // Ergebnis

        double summe = euro+cents;

        // Ergennis Ausgabe

        System.out.println("Amount: "+summe);

    }


Eine Art wie es gehen würde
 

berndoa

Top Contributor
Ivh bleib dabei, erst Alles in Ganzzahlen (ints) umwandeln, das Nötige berehcnen und erst fürs Ergebnis wieder zu double übergehen erscheint mri am Sinnvollsten.
Aber Geschmackssache, für eine Aufgabe wie hier macht es wohl wirklich keinen Unterschied, gerade wenn die vorkommenden Brüche nur sehr begrenzte Nahckommastellen produzieren
 

Neumi5694

Top Contributor
Ivh bleib dabei, erst Alles in Ganzzahlen (ints) umwandeln, das Nötige berehcnen und erst fürs Ergebnis wieder zu double übergehen erscheint mri am Sinnvollsten.
Aber Geschmackssache, für eine Aufgabe wie hier macht es wohl wirklich keinen Unterschied, gerade wenn die vorkommenden Brüche nur sehr begrenzte Nahckommastellen produzieren

Würde ich auch so machen. So lange nicht die Gefahr eines Überlaufs besteht, beim kleinsten gemeinsamen Nenner und der größten Genauigkeit bleiben. Es käme auch niemand auf die Idee, Zeitdifferenzen in Gleitkommasekunden zu berechnen.

Oder halt gleich mit BigDecimal arbeiten, was aber dank vieler Prüfungen noch deutlich langsamer sein dürfte als die Int-Umwandlung.
 

Ähnliche Java Themen

Neue Themen


Oben