kostenloser Webspace werbefrei: lima-city


Subtraktions-Fehler

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    n******t

    Hallo,
    zuallererst m?chte ich anmerken, dass ich nur wenig Erfahrung mit Java habe.

    Im Moment bin ich gerade dabei einen Taschenrechner mit JFrame usw. zu programmieren.
    So weit funktioniert alles, wenn ich auch nicht unbedingt immer den besten L?sungsweg genommen habe.

    Nun zu meinem Problem:
    Wenn ich 10.4 von 10.5 abziehen will, m?sste logischerweite 0.1 rauskommen.
    Nun kommt aber 0.09999999999999964 raus.
    Wie kann das sein?

    Ich hoffe ihr k?nnt mir helfen.
    Quellcode kann ich auf Verlangen noch posten.

    LG,
    nwo

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich kenne die Mathematik-Routinen von Java nicht, aber das Problem gibt es in allen Programmiersprachen. Komma-Zahlen werden intern in ein bin?res Format umgerechnet, und dort gibt 10,4 keine glatte Zahl, sondern einen bin?ren Bruch, der irgendwo mit einer Periode endet. Beim Berechnen wird dieser Bruch verwendet und nicht die Orginalzahl. Wird das Ergebnis dieser Berechnung dann wieder zur?ckgewandelt, um angezeigt werden zu k?nnen, entstehen wieder Abweichungen. So kommt das krumme Ergebnis zusammen.

    Abhilfe schaffen kann man am einfachsten, indem man die Mathematik-Bibliothek mit der h?chsten Genauigkeit nimmt, und die Zahlen dann vor der Ausgabe rundet.

    F?r manche Programmiersprachen gibt es auch Mathematik-Befehls-Bibliotheken, die mit "richtigen" Dezimalzahlen rechnen. Die sind dann zwar langsamer, machen aber diese Fehler nicht.
  4. wenn x das ergebnis ist, dann versuch es mal so:


    ((double)Math.round(x*1000000))/1000000



    so erh?ltst du das ergebnis auf 6 sellen genau
    also in deinem fall 0,1


    oder du schreibst dir eine eigene Klasse Zahl, in der du zum Beispiel mit dem Vor und nachkommateil getrennt rechnest.
  5. Autor dieses Themas

    n******t

    Deine Idee ist zwar gut, aber wenn eine Zahl nunmal mehr als 6 Nachkommastellen hat wird gerundet.
    Weil ich aber denk dass es selten mehr als 6 Nachkommastellen sind werde ich deine L?sung mal probieren.

    LG,
    nwo

  6. Hallo,
    zuallererst m?chte ich anmerken, dass ich nur wenig Erfahrung mit Java habe.

    Im Moment bin ich gerade dabei einen Taschenrechner mit JFrame usw. zu programmieren.
    So weit funktioniert alles, wenn ich auch nicht unbedingt immer den besten L?sungsweg genommen habe.

    Nun zu meinem Problem:
    Wenn ich 10.4 von 10.5 abziehen will, m?sste logischerweite 0.1 rauskommen.
    Nun kommt aber 0.09999999999999964 raus.
    Wie kann das sein?


    Benutze java.math.BigDecimal zum berenchen.

    Beispiel:
    java.math.BigDecimal x, y, z;
    x= new java.math.BigDecimal ("10.5");
    y= new java.math.BigDecimal ("10.3");
    z=x.subtract(y);
    System.out.println(""+z);

    Jens
  7. Autor dieses Themas

    n******t

    Danke, deine L?sung funktioniert wunderbar. Nur muss ich sie jetzt in einen String umwandeln, mit java.math.BigDecimal.toString(z); haut das leider nicht hin.
    Kannst du mir bitte sagen, wie das geht.
    Danke.

    nwo

  8. Danke, deine L?sung funktioniert wunderbar. Nur muss ich sie jetzt in einen String umwandeln, mit java.math.BigDecimal.toString(z); haut das leider nicht hin.
    Kannst du mir bitte sagen, wie das geht.
    Danke.

    nwo


    Du hast wohl noch nicht so oft die toString()-Funktion benutzt. ;)

    Man benutzt nat?rlich z.toString()
    Allerdings hat ja Java die nette Vereinfachung, dass wenn ein Objekt ?ber + zu einen String hinzugef?gt wird automatisch die toString() funktion aufgerufen wird.
    Schau doch mal in meinen Beispiel.
    In System.out.println(""+z) wird doch z in eine String umgewandelt. Denn z wird da ?ber den + Operator zu den leeren String hinzugef?gt.

    Jens
  9. Autor dieses Themas

    n******t

    Guuuut, mit System.out.println(); funktioniert die Geschichte auch wunderbar.
    Da mein Taschenrechner nun aber mit JFrame gemacht wurde will ich das Ergebnis nun nat?rlich auf dem Display, einem JTextField anzeigen.
    Wenn ich nun display.setText(ergebnis); mache zeigt er mir 0.0 an, egal welche Rechnung ich durchf?hre, es muss nur ein Komma vorkommen.
    Bei Addition etc. funktioniert das mit setText(); aber dennoch.

    Hast du ne Ahnung woran das liegen kann?

    LG,
    nwo

  10. Guuuut, mit System.out.println(); funktioniert die Geschichte auch wunderbar.
    Da mein Taschenrechner nun aber mit JFrame gemacht wurde will ich das Ergebnis nun nat?rlich auf dem Display, einem JTextField anzeigen.
    Wenn ich nun display.setText(ergebnis); mache zeigt er mir 0.0 an, egal welche Rechnung ich durchf?hre, es muss nur ein Komma vorkommen.
    Bei Addition etc. funktioniert das mit setText(); aber dennoch.

    Hast du ne Ahnung woran das liegen kann?


    Wenn er 0.0 Anzeigt ist das was er als Ergebinss rausbekommen hat 0.
    Also ist dein Ergibniss Falsch.
    Wenn es nur bei der Subtraktion ist w?rde ich da mal nachschauen.
    Ohne Quelltext kann ich nat?rlich nicht sagen, woran das liegen k?nnte.

    Jens
  11. Autor dieses Themas

    n******t

    Neeee... 0 kommt nich raus, denn wenn ich es mit System.out.println(); ausgebe stimmt es ja.

    Hier ist der Quelltext, der die Subtraktion durchf?hrt:

    x= new java.math.BigDecimal (zahl1);
    y= new java.math.BigDecimal (zahl2);
    ergebnis_subtraktion = x.subtract(y);
    ergebnis_string = ergebnis_subtraktion.toString();
    System.out.println(ergebnis_string); //so stimmt das Ergebnis
    display.setText(ergebnis_string);

    Als Zahl 1 hab ich 10.5 eingegeben, als Zahl2 10.4

    LG,
    nwo

    Beitrag ge?ndert am 20.12.2005 20:57 von nowayout
  12. Probier mal das:

    x= new java.math.BigDecimal (zahl1);
    y= new java.math.BigDecimal (zahl2);
    ergebnis_subtraktion = x.subtract(y);
    display.setText("Ergebnis:"+ergebnis_subtraktion);

    Wenn er das richtige Ergebniss berechnet kannst du
    display.setText(""+ergebnis_subtraktion);
    schreiben.

    Jens
  13. Autor dieses Themas

    n******t

    Danke jetzt, funktioniert es. Warst mir ne gro?e Hilfe :)

    LG,
    nwo
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!