2016-04-29 11 views
3

Ich möchte eine Zeichenfolge, verdeckte den gleichen Wert zu verdoppeln und halten:String Doppel Umwandlung verliert Präzision in Swift

let myStr = "2.40" 
let numberFormatter = NSNumberFormatter() 
numberFormatter.locale = NSLocale(localeIdentifier: "fr_FR") 
let myDouble = numberFormatter.numberFromString(myStr)?.doubleValue ?? 0.0 

myDouble ist jetzt

Double? 2.3999999999999999 

So wie "2.40" zu konvertieren genau wie 2,40 als Double ??

Update:

Auch nach der Umwandlung Runden scheint nicht

Ich will nicht zur Arbeit drucken, ich mag, wichtig berechnen, und es ist, dass die Zahl korrekt sein sollte, es ist Geld Berechnung und Preise

+0

http://floating-point-gui.de/ – Moritz

+0

Ich bin mir bewusst, dass aber ich möchte eine Lösung – iOSGeek

+0

Mögliche Duplikat [Warum sind Floating Point Ungenaue Zahlen?] (Http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate) – Ben

Antwort

5

Zunächst einmal: Sie nicht! Was Sie hier gefunden haben, heißt Gleitkomma-Ungenauigkeit. Computer können nicht jede Nummer genau speichern. 2.4 kann nicht verlustfrei in einem Fließkommatyp gespeichert werden.

Zweitens: Da Gleitkomma immer ein Problem ist und Sie mit Geld zu tun hier (ich denke, Sie versuchen, 2.4 Franken zu speichern), um Ihre Nummer eins Lösung ist: do floating nicht Kommazahl verwenden. Verwenden Sie die NSNumber Sie erhalten von der numberFromString und versuchen Sie nicht, eine Double daraus zu bekommen.
Alternativ können Sie das Komma durch Multiplikation verschieben und als Int speichern.

Die ersten Lösungen könnte in etwa so aussehen:

if let num = myDouble { 
    let value = NSDecimalNumber(decimal: num.decimalValue) 
    let output = value.decimalNumberByMultiplyingBy(NSDecimalNumber(integer: 10)) 
} 
+0

interessante Antwort, im Grunde werde ich die konvertierten Zahlen mal miteinander multiplizieren und summieren dann werde ich die anzeigen Nummer mit 2 Float-Genauigkeit, wie man das mit NSNumbe macht r? – iOSGeek

+1

@iOSGeek Entschuldigung für die verzögerte Antwort: Ich habe meine Antwort leicht bearbeitet, um einen kleinen Code-Schnipsel einzubauen, der einige Berechnungen zeigt. Die Anzeige des Wertes ist vollständig vom Problem der Gleitkommagenauigkeit entkoppelt. Um den Wert anzuzeigen, können Sie die Werte runden oder die 'NSNummer' auf die Anzeige anwenden, die * hoffentlich * die Nummer korrekt anzeigt. – luk2302