Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
DatentypenDouble = 0 / Double schneidet Nachkommastellen ab
ich muss von der Schule aus Übungsaufgaben im Fach Java erledigen. Die Aufgabe lautet:
Ein Rechenzentrum vermietet seine Leistung, die Kosten werden sekundengenau abgerechnet.
Nun bin ich dabei eine Methode zu schreiben, die mir die Kosten für eine Sekunde (0,241 ct/sec) berechnet und zurückgibt.
Jedoch werden beim Aufaddieren irgendwann die Nachkommastellen abgeschnitten.
Wenn ich in main() nun den Eurobetrag (kosten / 100) ausgeben möchte, erhalte ich 0.0.
Normalerweise sollte ein double dies nicht tun, ich habe ebenfalls andere Testdaten verwendet (z.B. 4/3 = 1,3333333).
Ich hoffe ihr könnt mir bei meinem Problem helfen.
Hier ist der Code:
Java:
import java.util.Date;
public class Rechenzeit {
public static void main(String[] args) {
Date start = new Date(2012 - 1900, 9, 23);
Date ende = new Date(2012 - 1900, 9, 24);
long dauer = (ende.getTime() - start.getTime()) / 1000 /* % 60 */;
System.out.println(start);
System.out.println(ende);
System.out.println(dauer);
System.out.println(Math.round(berechneKosten(start, ende)));
double kosten = berechneKosten(start, ende);
System.out.println(kosten);
}
public static double berechneKosten(Date start, Date ende) {
Date aktuell = start;
double kosten = 0.0;
while (aktuell.getTime() <= ende.getTime()) {
aktuell.setTime(aktuell.getTime() + (1 * 1000));
kosten += 0.241;
}
return kosten;
}
}
Ausgabe:
Code:
Tue Oct 23 00:00:00 CEST 2012
Wed Oct 24 00:00:00 CEST 2012
86400
20823
0.0
ja durch die aufrufe von setTime verändert wird. Wenn du nun das zweite mal berechneKosten aufrufst wird die Schleife kein einziges mal durchlaufen und 0.0 wird zurückgegeben.
Oha, ganz gemeines Problem: Mit [c]Date aktuell = start;[/c] referenzieren beide Variablen dasselbe Objekt, wenn du [c]aktuell[/c] hochzählst, dann gleichzeitig auch [c]start[/c]. Beim zweiten Aufruf der Methode ist dann [c]start[/c] bereits hochgezählt und die Schleife wird schon beim ersten Mal übersprungen.
Um eine wirkliche Kopie zu erstellen, kannst du [c]Date aktuell = new Date(start.getTime());[/c] verwenden.
Die Entscheidung von Sun, [c]Date[/c] überhaupt veränderlich zu machen, war ein konzeptioneller Fehler. Mit unveränderlichen Datentypen wie [c]String[/c] oder [c]Integer[/c] kann man erst gar nicht in so eine Falle tappen. Für ernsthafte Programme mit vielen Datumsberechnung empfiehlt sich die Bibliothel JODA-Time (Java selbst wird irgendwann etwas ähnliches spendiert bekommen).
Danke für die schnelle Antwort!
Ich hab das wohl noch nicht ganz verstanden, wann man Call by Value braucht und wann nicht. (Haben erst seit diesem Jahr OO-Programmierung und Java)
So funktioniert es jetzt.