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 № 1NumberFormatter
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 Decimal
s:
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 Decimal
s 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)!)