Float rechen Problem

  • Hallöchen Leute...


    Bin gerade an der Anpassung meines Spieles auf andere Geräte/Auflösungen. Bisher war ein Objekt bei meinem SGS2 50 Pixel breit und möchte es nun prozentuell auf andere anpassen. Daher die Rechnung:


    100/480*50 = 10,42 (%).
    daher muss ich jetzt bei der breite folgendes schreiben: width/100*10.42F;


    width wird vorher ermittelt und gibt bei jeden Gerät die passende breite an, hab das auch schon getestet, dort kann also kein Fehler passiert sein.


    Da das Ergebnis im Spiel jedoch auf 41,68 bei meinem SGS2 ausfällt, kann hier etwas nicht stimmen. Die Nachrechnung mit einem normalen Taschenrechner ergibt: (480/100*10,42 =) 50,016


    Jetzt habe ich gelesen, dass es ein Floating point problem gibt, sodass kleine Abweichungen passieren können. Daraufhin habe ich mir gedacht, ich lass mal die Kommazahlen zum testen weg. Demnach müsste b_width (auf diese Variable werden diese Rechnungen geschrieben) ausspucken: (480/100*10 =) 48. Ausgespuckt wird im Spiel jedoch 40.


    Daher meine Frage, wie kann so etwas passieren und wie löst man dieses Problem am Besten?
    Was mich auch verwundert ist, dass ich die höhe ebenfalls mit dieser Formel berechnen lasse, diese jedoch korrekt ist.


    Hier der Code zur Veranschaulichung:



    Würde mich über Antworten freuen:D
    MFG

  • Android (java) nimmt zum rechnen denn passensten typen (hier int) und die sind nur ganzzahlig, es wird also gerundet (immer nach unten)
    Probier mal hinter die zahlen ein "f" zu schreiben (auch bei 100!) dann werden sie als float interpretiert.


    Gruss antifish

  • Eyup. Bei gleichberechtigten Rechenoperationen (Punktrechnung) wird explizit von links nach rechts durchgerechnet.
    Und 480/100 ist als Integerwert 4.
    4 * 10.42 ist dann 41.68
    480/100.0 (oder 480/100f) hingegen wird zu 4.8 und 4.8 * 10.42 zu 50.016


    Die Ungenauigkeit von Floats wirst du in diesem Fall noch nicht zu spüren bekommen.
    Das bekommst du erst bei Entfernungsberechnungen im Kilometerbereich aus GPS Koordinaten oder bei Kreisberechnungen in ähnlich großen oder noch größeren Dimensionen.


    Auch spaßig: Vergleiche, beispielsweise if(floatValue == 1.0).
    Geht fast immer schief, weil floatValue irgendwas bei 1.00000000000009345 ist.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Was mir dennoch ein rätsel bleibt ist, warum das dann bei der Höhe funktioniert...


    Rechne es einfach rückwärts.


    höhe/100*6,25 = 50;
    höhe/100 = 50/6,25;
    höhe/100 = 8;
    höhe = 8 * 100;
    höhe = 800;


    800/100 = 8 // Ganzzahl, keine abgeschnittenen Zahlen.
    8 * 6,25 = 50;


    Bei einer Breite von 400 oder 500 hätte es auch funktioniert, 480 hingegen läuft nicht. ;)
    Eine Höhe von 640, 780 oder 801 hätte auch nicht geklappt, 800 hingegen passt super.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Danke für deine Ergänzung Lukas :D
    Jop stimmt schon, die Zahl ging genau auf :P


    Da ich schon viele Berechnungen auf die selbe Weise (mit den selben Fehler) durchgeführt habe, freut es mich jetzt umso mehr, dass diese wie zuerst gedacht doch nicht so verzerrt sind und auch auf Displays mit weniger hohen Auflösung gut aussehen :P

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!