/ / Jak przekonwertować wartość wykładniczą na wartość dziesiętną - szybkie, formatowanie liczb

Jak przekonwertować wartość wykładniczą na wartość dziesiętną - szybkie, formatowanie liczb

let balance = "2.477854178281608e-06"
// I have to convert this exponential value in Decimal

/ * Wypróbował już wymienione poniżej rozwiązanie, ale nie działa * /

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let finalNumber = numberFormatter.number(from: balance)
print(finalNumber!)

Wartość jest drukowana "2.477854178281608e-06n"

Każda pomoc zostanie doceniona.

Odpowiedzi:

4 dla odpowiedzi № 1
let balance = "2.477854178281608e-06"
// I have to convert this exponential value in Decimal

To nie jest wartość wykładnicza. Jest to ciąg reprezentujący liczbę przy użyciu formatu wykładniczego. Wydaje się, że chcesz mieć ciąg reprezentujący tę samą liczbę w innym formacie. Ważną rzeczą tutaj jest to, że żaden ciąg nie jest "wartością". Wartość jest taka sama niezależnie od reprezentacji (lub w przybliżeniu taka sama, jeśli reprezentacja jest ograniczona).

Więc najpierw potrzebujesz wartości reprezentowanej przez ciąg. Aby to zrobić, przekonwertuj go na Double.

let value = Double(balance)!

Teraz mówisz, że chcesz przekonwertować to na ciąg w formacie dziesiętnym (zakładam, że masz na myśli 0.000...). Potrzebujesz więc formatera:

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 20
let string = numberFormatter.string(for: value)!
print(string)  // 0.00000247785417828161

Zauważysz, że ta wartość jest nieco inna niż poprzednia wartość, ponieważ występują błędy zaokrąglania, gdy mamy do czynienia z tak małymi wartościami.


Jeśli wszystkie z tych dziesięciocyfrowych cyfr są ważne, możesz pracować z Decimal wpisz zamiast Double. Pozwala to uniknąć zaokrąglania dziesiętnego / binarnego, ale jestmniej wygodne i wolniejsze dla niektórych rodzajów matematyki. Jeśli jest to rodzaj waluty wyrażony w jednostkach podstawowych 10 (czyli w zasadzie wszystkie z nich), zawsze chcesz pracować z Decimal i nigdy z Double.

let balance = "2.477854178281608e-06"
let value = Decimal(string: balance)!

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 21
let string = numberFormatter.string(for: value)!
print(string)  // 0.000002477854178281608