2016-08-23 2 views
7

Quel type de données je peux utiliser pour analyser Java BigDecimal? En Objective-C, cela peut être fait en utilisant NSDecimalNumber. Est-ce que j'ai une solution native de Swift (sans utiliser NSDecimalNumber)?Java BigDecimal dans Swift

+3

Il suffit d'utiliser 'NSDecimalNumber'. Cela fonctionne très bien avec Swift. – Rob

+0

Vous ne comprenez pas. Je veux natif pour la solution Swift (bien sûr, si elle existe). – SerjOxo

+0

Je comprends. Une solution "native" n'existe pas. Mais 'NSDecimalNumber' fonctionne bien. Et si vous le souhaitez, vous pouvez définir des opérateurs qui le font se comporter davantage comme une solution native afin que les opérateurs tels que '+ ',' -', etc., fonctionnent comme vous le souhaitez. – Rob

Répondre

7

Cela peut ne pas être ce que vous voulez, comme vous le dites solution swift-native. Mais dans Swift 3, un ancien NSDecimal basé sur C-struct est importé comme Decimal, et un gros arrangement a été fait pour dire "il est presque natif-natif".

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 

MISE À JOUR Ajouté Un exemple simple, où vous pouvez trouver une erreur de calcul dans Double (binaire système à virgule flottante). (Testé dans 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