Z jakiegoś powodu niektóre Doubles w mojej aplikacji Swift sprawia mi problemy podczas konwersji do NSNumber, podczas gdy inne nie. Moja aplikacja musi przekonwertować liczbę podwójną z 2 miejscami dziesiętnymi (ceny) na NSNumbers, aby można je było przechowywać i pobierać za pomocą danych podstawowych. Na przykład kilka konkretnych cen, takich jak 79,99, oszacowałoby 99,98999999999999, o ile nie zostanie specjalnie sformatowane przy użyciu metody doubleName klasy NSNumber.Konwersja Double na NSNumber w Swift traci dokładność
Tutaj selectedWarranty.price = 79,99, jak pokazano na debugger
// item.price: NSNumber?
// selectedWarranty.price: Double?
item.price = NSNumber(double: selectedWarranty.price!)
ja zaprogramować niektóre wypowiedzi drukowania, aby pokazać jak konwersja odrabia
Original double: 79.99
Converted to NSNumber: 79.98999999999999
.doubleValue Representation: 79.99
Może ktoś wyjaśnić, czy istnieje powód, dlaczego inicjator nie może z pewnością zachować 2 miejsc po przecinku dla każdej liczby? Naprawdę chciałbym przechowywać ceny w podstawowych danych, tak jak powinny. Formatowanie za każdym razem, gdy jest wyświetlane, nie brzmi zbyt wygodnie.
UPDATE: Stary obiekt Rdzeń danych wpisać NSDecimalNumber przez model danych, 79.99 i 99.99 nie jest już problemem, ale teraz łatwiejsze problem z różnymi numerami ...
Original double: 39.99
Converted to NSDecimalNumber: 39.99000000000001024
Czy możesz zrobić [minimalny, kompletny i weryfikowalny przykład] (http://stackoverflow.com/help/mcve)? – Alexander
Użyj 'NSDecimalNumber' zamiast' NSNumber' dla waluty. – rmaddy
Nie mogę odtworzyć tego problemu. http://swiftlang.ng.bluemix.net/#/repl/57bdc2590dcf4abf47da28c2 – Alexander