/ / NumberFormatter vydanie pre veľké číslo - rýchle, numberformatter

NumberFormatter vydanie pre veľké číslo - rýchle, numberformatter

Vyskúšam tento kód na konverziu reťazca na číslo a naopak. tento kód musí vytlačiť rovnaké výstupy. ale jeho výstup nie je správny. môže mi niekto pomôcť?

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
}

aj tento kód má rovnaký problém

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

odpovede:

4 pre odpoveď č. 1

NumberFormatter produkuje Int64 keď analyzuje reťazec v príklade. Tento typ môže presne predstavovať číselnú hodnotu. Formátor však používa dvojitú aritmetiku aj pre 64-bitové celé čísla na výpočet reťazcovej reprezentácie čísla. Dvojnásobok môže predstavovať nanajvýš 16 alebo 17 desatinných miest. To vedie k prekvapivým odlišným výsledkom.

Tomu môžete zabrániť použitím 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

ÚPRAVA: Používa sa Decimals pre formátovanie postačuje na presné výsledky:

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

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