2016-08-23 23 views
7

Jakiego typu danych mogę użyć do analizy Java BigDecimal? W Objective - C można to zrobić za pomocą NSDecimalNumber. Czy mam rozwiązanie natywne Swift (bez użycia NSDecimalNumber)?Java BigDecimal w Swift

+3

Po prostu użyj 'NSDecimalNumber'. Działa dobrze od Swift. – Rob

+0

Nie rozumiesz. Chcę natywnego rozwiązania Swift (oczywiście, jeśli istnieje). – SerjOxo

+0

Rozumiem. "Natywne" rozwiązanie nie istnieje. Ale 'NSDecimalNumber' działa dobrze. A jeśli chcesz, możesz zdefiniować operatory, które sprawiają, że zachowuje się bardziej jak natywne rozwiązanie, więc operatory takie jak '+', '-' itd. Działają tak, jak się spodziewasz. – Rob

Odpowiedz

7

To może nie być to, co chcesz, jak mówisz szybkie rozwiązanie natywne. Ale w Swift 3, stare C-struct oparte na NSDecimal zostało zaimportowane jako Decimal, a duża reorganizacja dla niego została zrobiona, aby powiedzieć "jest prawie Swift-native".

let deca = 1.23 as Decimal //<- This actually may produce some conversion error, while `ExpressibleByFloatLiteral` uses `Double` as an intermediate value. 
let decb = 0.01 as Decimal 
print(deca + decb == 1.24) //->true 

UPDATE Dodany prosty przykład, gdzie można znaleźć błędu obliczeniowego double (binarny system punktowy pływającej). (Testowane w Xcode 8 beta 6.)

let dblc = 0.000001 
let dbld = 100 as Double 
let dble = 0.0001 
print(dblc * dbld == dble) //->false (as Double cannot represent decimal fractions precisely) 

let decc = Decimal(string: "0.000001")! //<- avoiding conversion error 
let decd = 100 as Decimal //<- integer literal may not generate conversion error 
let dece = Decimal(string: "0.0001")! 
print(decc * decd == dece) //->true