/ / NumberFormatterの大きな問題 - クイック、numberformatter

多数の番号の素早いnumberformatterのNumberFormatter問題

私はこのコードを、文字列を数値に、そしてその逆に変換するために試します。 このコードは同じ出力を表示しなければなりません。しかし、その出力は正しくありません。 誰かが私を手伝ってくれる?

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は4

NumberFormatterInt64 例の文字列を解析するとき。 この型は数値を正確に表すことができます。しかし、フォーマッタは数値の文字列表現を計算するために64ビット整数に対しても二重演算を使用します。 doubleは、最大で16桁または17桁の10進数を表します。これは驚くべき異なる結果につながります。

これを避けるには 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

編集:使用する Decimal正確な結果を得るには書式設定用のsで十分です。

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

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