2012-04-11 7 views
0

kann mit einem abit der Mathematik beginnen.android falsche Subtraktion vom Benutzer zur Verfügung gestellt Eingangs

Zielgewicht = 8,4 aktuelles Gewicht = 9,1 aktuelles Gewicht - Zielgewicht = 0,7 (Sie würden denken, so)

if(obj != null && obj.targetWeight != null && obj.currentWeight != null) { 
      try { 
       double i = Double.parseDouble(obj.targetWeight); 
       double o = Double.parseDouble(obj.currentWeight); 
       //do something if target weight is a number 
       if(i>o){ 
        outputEditText.setText ("Congratulations. you have passed your target weight"); 
       } 
       else if (i<o){ 
        outputEditText.setText(
          "Your Target Weight is " + obj.targetWeight +obj.unit + "\n" + 
            "Your Current Weight is " + obj.currentWeight + "\n" + 
            "Difference is " + (o - i)); 
       } 

nach den obigen 8.4-9.1 = 0,6999999999999993

beiden Zielen und aktuelle Gewichtungen sind vom Benutzer bereitgestellte Eingaben, die als doppelt geparst werden.

weiß jemand, was ich

vielen Dank

falsch falsch machen

Antwort

4

Sie nichts zu tun. Willkommen in der wunderbaren Welt der Gleitkommaarithmetik! Viele Zahlen, die schön und sogar für uns aussehen, können nicht wirklich in dem von Ihrem Computer verwendeten Binärzahlsystem dargestellt werden.

Die Antwort auf Ihr unmittelbares Problem ist Formatierung. Sie können nie einfach rohe Zahlen mit doppelter Genauigkeit drucken; Sie immer müssen z. B. DecimalFormat verwenden, um eine angemessene Anzahl von Dezimalstellen zu präsentieren. Ihre Zahl, beispielsweise auf fünf Dezimalstellen gerundet, würde als 0,7 ausgegeben.

+0

lol. Ich habe gerade einen Artikel über Gleitkommaarithmetik gefunden. Staudamm ist dumm. Gibt es eine Arbeit? Dies ist ein Muss Feature auf der App –

+0

@ TuffyG Sie können die Antwort auf x Ziffern runden, um eine benutzerfreundliche Darstellung zu erhalten. – Jave

+0

Wenn Sie absolute Genauigkeit für alle Gleitkommaberechnungen haben müssen, und Sie keinen großen Leistungseinbruch haben, können Sie immer die Klasse 'BigDecimal' verwenden, die jede Dezimalzahl genau darstellen kann. Aber normalerweise ist das Runden/Formatieren reichlich. –

1

Nicht alle Dezimalstellen (d verdoppelt) kann 2. So perfekt in der Basis ausgedrückt werden, erhalten Sie oft einen runden, was in dem, was Sie gerade gesehen haben. Die Ausgabe von .6999999 ... ist die beste Annäherung des Computers an die Subtraktion unter Verwendung der ungefähren Basis 2-Darstellung Ihrer Eingabe.

0

Vielen Dank für Ihre Antworten.

es stellt sich die Welt der Maschinen aus ist anders, was wie mein Gehirn vielleicht denken.

hier ist, was ich mein Problem getan habe zu lösen.

DecimalFormat df = new DecimalFormat("####.##"); 

        String b = df.format(o-i); 
Verwandte Themen