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
7
A
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
Il suffit d'utiliser 'NSDecimalNumber'. Cela fonctionne très bien avec Swift. – Rob
Vous ne comprenez pas. Je veux natif pour la solution Swift (bien sûr, si elle existe). – SerjOxo
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