Erstellen von floats mit nur 3-4 Nachkommastellen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Erstellen von floats mit nur 3-4 Nachkommastellen

    Hallo alle zusammen,

    ich sitze momentan an einem Problem, bei dem ich echt einfach nicht mehr weiter weiß. Ich möchte eine float Gleitkommazahl generieren, die nur 3 Nachkommastellen hat (z.b 3.456000). Wenn ich jedoch jegliche Wege durchprobiere (zusammensetzen über einen String, Multiplizieren dann Runden und wieder Teilen, normales Runden,....) komme ich Immer auf einen Wert, der Nahe zu diesen 3 Nachkommastellen sitzt. Aber eben nicht ganz. Mein float sieht dann meistens so aus: 3.6239997 oder 3.800001.
    Da dies in einer Art Mathe Kopfrechnen App ausarten soll, muss der Nutzer ja mit diesen Werten weiterrechnen und im Code soll mit diesen Werten auch weitergerechnet werden (Überprüfung der Nutzereingabe).

    Ich weiß einfach nicht mehr weiter wie ich einen Float mit 3 Nachkommastellen (3.9870000 - die 0er sind ja am Ende egal) erzeugen kann.

    Vielen Dank

    Nils
  • Was heißt erzeugen? Der Datentyp hat eben ne feste Anzahl an Nachkomma Stellen, egal wie viele Nullen.
    Aber die Ausgabe kannst du ja z.B. mit

    Quellcode

    1. printf("%.3f", myFloat);

    formatieren
  • Du wirst neimals auf deine gewünschten Werte kommen wenn du mit float oder double rechnest. Wenn Du 3 fixe Nachkommestellen haben willst, dann rechne halt mit NSInteger indem du alle Werte mit 1000 multiplizierst. Bei der Anzeige (Und nur bei der Anzeige) machst du dann ein /1000 und %1000

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ach ja, was waren das noch Zeiten, als Programmierer um jedes Byte gekämpft haben und so Dinge wie "binary vs. decimal" und "float vs. fixed decimal" im Schlaf konnten...

    Du wirst eine Zahl mit dezimal endlichen Nachkommastellen nur per Zufall in eine endliche Binärzahl gespeichert bekommen. Ausgabeformatierung ist der Lösungsweg, oder Du musst ein anderes internes Format wählen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Danke erstmal für eure Antworten. Leider würde das Verwenden von einfachen NSIntegern relativ schwer werden, da ich so auch immer die Teiler (z.B 1000 , 100, 10 - variiert von Aufgabe zu Aufgabe) mitschleppen müsste....
    @MyMattes Was meinst du mit anderen internen Formaten? Welches würdest Du da empfehlen?

    Nils
  • Wenn Du eine exakte Speicherung dezimaler Nachkommastellen brauchst, bleibt eben nur das Dezimalsystem zur internen Darstellung. Manche Programmiersprachen ermöglichen bei der Deklaration dezimale Festkommazahlen, Objective-C nicht. Dann kannst Du eben nur entsprechend skalierte Ganzzahlen nehmen, also die von Claus genannte Methode.

    ich würde in der maximal notwendigen Genauigkeit speichern, also z. B. in Tausendstel, und für die Ausgabe bei Bedarf formatieren...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Float und Fixed sind beides gangbare Wege - hängt von der Aufgabe ab, besonders vom Wertebereich und davon, wie bei Berechnungen gerundet werden soll.

    Ich werfe mal eine dritte Alternative in den Raum: NSDecimalNumber. Die arbeiten mit Fließkommazahlen zur Basis 10 (haben also nicht das eigenartige Rundungsverhalten von Floats im Dezimalsystem) und man kann sie per NSDecimalNumberBehavior auf drei Nachkommastellen einstellen. Das sollte das beste aus beiden Welten sein, kann aber sein, dass das für die Aufgabe Overkill ist.
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    Float und Fixed sind beides gangbare Wege - hängt von der Aufgabe ab, besonders vom Wertebereich und davon, wie bei Berechnungen gerundet werden soll.

    Ich werfe mal eine dritte Alternative in den Raum: NSDecimalNumber. Die arbeiten mit Fließkommazahlen zur Basis 10 (haben also nicht das eigenartige Rundungsverhalten von Floats im Dezimalsystem) und man kann sie per NSDecimalNumberBehavior auf drei Nachkommastellen einstellen. Das sollte das beste aus beiden Welten sein, kann aber sein, dass das für die Aufgabe Overkill ist.


    Danke, das klappt wunderbar. Kann jetzt sogar alles unter einen Hut bringen. (-:

    Nils