Programm modifizieren < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:21 So 07.10.2007 | Autor: | Herby |
Hallo,
ich hab nun eine Kontoabrechnung erstellt
[Dateianhang nicht öffentlich]
das klappt auch alles ganz gut, allerdings passiert hier bei der Eingabe
meinKonto.zahleAus(300.256)
sowas:
[Dateianhang nicht öffentlich]
Meine Fragen sind daher:
1. Wie kann ich das Ergebnis auf zwei Stellen runden lassen?
2. Was muss ich programmieren, dass nur ein Wert mit zwei Stellen hinter dem Komma eingegeben werden darf?
Liebe Grüße
Herby
Dateianhänge: Anhang Nr. 1 (Typ: JPG) [nicht öffentlich] Anhang Nr. 2 (Typ: JPG) [nicht öffentlich]
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:40 So 07.10.2007 | Autor: | piet.t |
Hallo,
tja, das ist das alte Problem, dass bei den java-Gleitkommatypen die Zahlen binär gespeichert werden und es daher bei Zahlen, die im Dezimalsystem exakt dargestellt werden können leicht irgendwelche Rundungfehler auftauchen.
Zu Deinen Fragen:
>
> Meine Fragen sind daher:
>
> 1. Wie kann ich das Ergebnis auf zwei Stellen runden
> lassen?
Einen wirklich schönen Weg gibt es da nicht, das einfachste ist wohl etwas in der Art von
1: | value = Math.round(value*100d)/100d;
|
Beachte aber, dass auch wenn Du irgendwelche Zwischenwerte rundest noch nicht sichergestellt ist, dass dann auch das Ergebnis sauber gerundet ist...
>
> 2. Was muss ich programmieren, dass nur ein Wert mit zwei
> Stellen hinter dem Komma eingegeben werden darf?
Hier sollten die Methoden in Deiner Konto-Klasse prüfen, ob der übergebene Wert ein korrektes Format hat, etwa so:
1: | if(value - Math.round(value*100d)/100d != 0){
| 2: | throw new IllegalArgumentException();
| 3: | }
|
Oder besser (da Abfragen auf == 0 bei Gelitkommafeldern wegen Rundungsdifferenzen immer kritisch sind) etwas in der Art:
1: | if(Math.abs(value - Math.round(value*100d)/100d)>1E-10) {
| 2: | throw new IllegalArgumentException();
| 3: | }
|
Alternativ kannst Du natürlich auch versuchen, Deine Betragsfelder nicht als double sondern als BigDecimal zu deklarieren - damit geht man einigen Problemen von vorneherein aus dem Weg, allerdings kostet das auch einiges an Performance.
Gruß
piet
>
>
> Liebe Grüße
> Herby
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:17 Mo 08.10.2007 | Autor: | Herby |
Hallo Piet,
vielen Dank - funktioniert alles
lg
Herby
|
|
|
|
|
sehr amüsant zu sehen, dass eine ehemalige Klausur von mir anscheinend populär ist .
Nun eine kleine Frage: Was hat ein Naturwissenschafts-Student mit Programmiersprachen am Hut? (reine Interessensfrage)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:13 Mi 10.10.2007 | Autor: | Herby |
Hi Daniel,
der naturwissenschaftliche Student studiert so'n Mix aus Mechanik - Elektronik und Informatik ==> Mechatronik und da ist nun mal das Programmieren ein Pflichtprogramm (Java, Assembler, VHDL, SPS)
Das Beispiel stammt übrigens aus dem Buch "Grundkurs JAVA" von Dietmar Abts (Kapitel 3 in der 4. Aufl.) - is doch cool, wenn aus so Schmökern Klausuraufgaben entstehen, dann kann man wenigstens hinterher mal nachlesen, was man vorher falsch gemacht hat
Liebe Grüße
Herby
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 22:49 Mi 10.10.2007 | Autor: | Marc |
Hallo Herby,
> 1. Wie kann ich das Ergebnis auf zwei Stellen runden
> lassen?
Ich kenne mich mit Java nicht aus, interessant fand ich aber das:
http://www.torsten-horn.de/techdocs/java-basics.htm#FormatierungRundung
Monetäre Beträge würde ich vielleicht als Integer speichern, und den Zugriff darauf über eine Klasse vereinfachen.
Dafür sollte es aber bereits Bibliotheken geben...
> 2. Was muss ich programmieren, dass nur ein Wert mit zwei
> Stellen hinter dem Komma eingegeben werden darf?
Zum Beispiel die Eingabe als String einlesen und dann auf Fehler überprüfen.
Viele Grüße,
Marc
|
|
|
|
|
> Zum Beispiel die Eingabe als String einlesen und dann auf
> Fehler überprüfen.
Das wäre nicht so gut, weil man dann aucb Buchstaben eingeben kann, und die Einbeziehung von Strings in die Überprüfung nur unnötig umständlich wäre. Stattdessen kann man auch ganz einfach die Anzahl der Stellen zählen lassen. Soll es bereits bei der Eingabe geschehen, so ist das hier geradezu prädestiniert für solch eine Aufgabe.
Ich liebe Java ...
|
|
|
|
|
> Dann kann ich Dich ja mal fragen: Gibt es auch
> Java-Programme, die (inklusive dem ganzen Java-Interpreter)
> nicht mit 100MiB oder sogar mehr im Hauptspeicher liegen?
> Ich bin jedes Mal entsetzt, wenn mein Browser die Java-VM
> hochfährt. In diesen Augenblicken kann ich die allgemeine
> Begeisterung für Java nicht nachvollziehen...
Java hat leider einen langen Schwanz, der allerdings eine grosse Kompatibilität ermöglicht. Die Basisklassen einer JRE sind eben recht umfangreich, allerdings kann man damit theoretisch sogar 3D-Anwendungen erzeugen. Bei der Entwicklung dieser modernen, objektorientierten Sprache wurde eben auf Rapid Development und Kompatibilität großen Wert gelegt, diese beiden Sachen lassen sich nicht ganz kostenlos vereinen o.0.
Derzeit sind mir keine Distributionen bekannt, die spürbar weniger Ressourcen fressen (ausser Java ME, aber das is ja nur für _sehr_ kleine Anwendungen interessant) ... muss man eben hinnehmen. Moderne Spiele werden immer grösser, moderne Programme werden immer grösser und so auch die Sprachen. Das ist auch das Haupt-Gegenargument an C oder C++ --> is einfach veraltet, selbst wenn man mit einigen Kniffen nahezu alle Vorteile von Java-ähnlichen Sprachen erreichen kann, so ist dies nie wirklich das gelbe vom Ei.
Nicht umsonst setzen schon die ersten großen Entwickler auf das neue Prinzip, es ist eben einfach Zeit für einen Wechsel, immerhin hat sich die Systemarchitektur seit dem ersten C deutlich weiterentwickelt, moderne Versionen sind (leider muss man das sagen) nur noch Flickenteppiche. (auch wenn sie immernoch sehr gut funktionieren, ein repariertes Auto mit neuem Kat läuft doch auch super! Ich verneige mich vor den altehrwürdigen C'lern, deren Werke waren/sind fantastisch.)
Wie gesagt: Java ME wäre evtl. mal einen Test wert, aber da wirst du eher AUFstocken müssen um deine Bedingungen zu erfüllen
Und um es schonmal vorweg zu nehmen:
Frage:
"Warum kann ich mit den Scheiss hier keine exe-dateien erzeugen????"
Antwort:
"Kannst du, solche Dateien heissen hier eben jar, sind gepackt und benötigen (leider) immernoch eine JRE zum starten ... aber eine exe-datei benötigt auch einen Interpreter, dieser ist sinnigerweise in Windows integriert, die nächste Windows-Version hat evtl. auch einen Java-Interpreter (sagt man)"
|
|
|
|
|
> Allerdings hat das (in seiner puren Anwendung)
> auch Nachteile, z.B. Unverständnis beim User, warum das
> Zeichen nicht erscheint/angenommen wird.
Man wird doch über die Verweigerung informiert ... schalt eben mal deine Computerboxen an
Also das kenne ich auch aus jeder anderen Sprache --> gewünschte Aktion unmöglich == "PINNG!"
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:17 Mi 10.10.2007 | Autor: | Herby |
Hallo Marc,
die Sachen stehen im meinem Buch auch alle drin, ich war nur noch nicht soweit mit dem Lesen
Ich habe das DecimalFormat mal nachprogrammiert - klappt auch gut.
Schönen Abend noch
Liebe Grüße
Herby
|
|
|
|