私はこのコードを、文字列を数値に、そしてその逆に変換するために試します。 このコードは同じ出力を表示しなければなりません。しかし、その出力は正しくありません。 誰かが私を手伝ってくれる?
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
}
このコードも同じ問題があります
print(formatter.string(from:NSNumber(value: 10123456789012349)))
//output is 10123456789012348
回答:
回答№1は4NumberFormatter
は Int64
例の文字列を解析するとき。 この型は数値を正確に表すことができます。しかし、フォーマッタは数値の文字列表現を計算するために64ビット整数に対しても二重演算を使用します。 doubleは、最大で16桁または17桁の10進数を表します。これは驚くべき異なる結果につながります。
これを避けるには 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
編集:使用する Decimal
正確な結果を得るには書式設定用のsで十分です。
let formatter: NumberFormatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
let d1 = 10123456789012349 as Decimal
print(formatter.string(from: d1 as NSNumber)!)