2017-01-04 6 views
1

Ich bemerkte, dass einige Fließkommawerte unterschiedlich konvertiert wurden. This question helps me about floating points aber immer noch nicht wissen, warum das passiert? Ich habe zwei Screenshots aus dem Debug-Modus über den Beispielcode hinzugefügt. Beispielwerte: 7.37 und 9.37. Begegnete es in schnellen und sicher schnellen Anwendungen IEEE 754 floating point standard Pls erklären, wie das passiert? Wie endete die Bekehrung anders?Warum passiert das bei der Fließkomma-Konvertierung?

if let text = textField.text { 
    if let number = formatter.number(from: text) { 
    return Double(number) 
    } 
    return nil 
} 

enter image description here

enter image description here

+1

Fließkommazahlen haben * endliche Genauigkeit * - welcher Teil der Antwort, die Sie verknüpft haben, ist nicht klar? –

+0

Vergleichen http://stackoverflow.com/a/39777334/1187415: Abhängig davon, wie die Nummer gedruckt wird, wird 'description' oder' debugDescription' verwendet, und diese beiden Methoden verwenden unterschiedliche Genauigkeit für die Umwandlung in eine Zeichenfolge. –

+0

Linked Q ist klar, aber ich verstehe nicht, warum 7,37 nicht konvergiert wie 9,37? Ich meine 7,37 konvergiert von rechts (7,3700000,1), aber 9,37 konvergiert von links (9,36999,2). @ martin-r danke für deine Antwort aber immer noch nicht klar für mich. Ich habe keine andere Genauigkeit für die Umwandlung gewählt, wie Sie in Ihrem Kommentar erklären können – yilmazburk

Antwort

1

Double Gleitkommazahlen sind in der Basis-2, gespeichert und genau alle Dezimalzahlen nicht darstellen kann.

In diesem Fall 7,37 und 9,37 werden zu den nächsten Gleitkommazahlen gerundet die 7,37000000000000010658141036401502788066864013671875 und 9,3699999999999992184029906638897955417633056640625 sind, respectively.

Natürlich sind solche Dezimaldarstellungen für den allgemeinen Gebrauch zu unhandlich, so dass Programmiersprachen typischerweise kürzere ungefähre dezimale Darstellungen drucken. Zwei beliebte Wahl ist

  1. Der kürzeste Zeichenfolge, die auf die ursprüngliche Zahl richtig gerundet werden (die in diesem Fall sind 7.37 und 9.37, respectively).
  2. Abgerundet 17 signifikante Ziffern, die is guaranteed to give the correct value when converting back to binary.

Diese scheinen den 2 Debug-Ausgabewerten zu entsprechen, die Sie sehen.

Verwandte Themen