/ / Nombre NumberFormatter pour grand nombre - swift, numberformatter

Numéro NumberFormatter pour grand nombre - swift, numberformatter

J'essaie ce code pour convertir une chaîne en nombre et vice versa. ce code doit imprimer les mêmes sorties. mais sa sortie n'est pas correcte. Quelqu'un peut-il m'aider?

let formatter: NumberFormatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")


if let r1 = formatter.number(from: "10123456789012349") , let r2 = formatter.string(from:r1){

print(r1) // output = 10123456789012349
print(r2) // output = 10123456789012348
}

aussi ce code a le même problème

print(formatter.string(from:NSNumber(value: 10123456789012349)))
//output is 10123456789012348

Réponses:

4 pour la réponse № 1

NumberFormatter produit un Int64 quand il analyse la chaîne dans l'exemple. Ce type peut représenter exactement la valeur numérique. Mais le formateur utilise une double arithmétique, même pour les entiers 64 bits, pour calculer la représentation sous forme de chaîne d'un nombre. Un double peut représenter environ 16 ou 17 chiffres décimaux au plus. Cela conduit à des résultats différents surprenants.

Vous pouvez éviter cela en utilisant Decimals:

let formatter: NumberFormatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
formatter.generatesDecimalNumbers = true

let r1 = formatter.number(from: "10123456789012349")
let r2 = formatter.string(from: r1!)
print(r1!) // 10123456789012349
print(r2!) // 10123456789012349

EDIT: Utiliser Decimals pour le formatage est suffisant pour des résultats exacts:

let formatter: NumberFormatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
let d1 = 10123456789012349 as Decimal

print(formatter.string(from: d1 as NSNumber)!)