Miejsce po przecinku

0

Witam,

Wiem, że temat był wałkowany ale nie potrafię znaleźć odpowiedzi.
Mam obliczone coś tam w zmiennej typu double ale potrzebuję przechować wartość z trzema miejscami po przecinku.
Zaznaczę że nie chcę wyrzucać tego na ekran (cout) z ustawieniem setprecision ale zamienić zwartość np 134.2134554 i na 134.213

Pomocy

Pozdrawiam

0

Pomnoz przez 1000 i trzymaj jako unsigned/long/int whatever... A docelowo dzielisz przez 1000 i masz z 3 miejscami po przecinku.

0

double rounded = std::round(val * 1000.) / 1000.;

0

Dzięki.

Pozdrawiam

2

Musisz uważać na mnożenie przez 1000, gdyż nie wszystkie tego typu operację będą poprawne.
https://wandbox.org/permlink/bhopZCqEAq0fgNCL
Swoją drogą dlaczego musisz akurat ograniczyć się do takiej precyzji?

1

Jeśli chcesz mieć liczby z określoną sztywno dokładnością, to używanie do przechowywania wartości liczb zmiennych jest pomyłką.

0

Jeżeli chodzi tylko o wyświetlanie to jest std::setprecision. Jeśli potrzebujesz przechowywać w systemie zaokrogląne wartości to wtedy tak...

double roundValue(double val, int decimalPlaces)
{
  const double magnitude = std::pow(10, decimalPlaces);
  return round(val * magnitude) / magnitude;
}

Jeżeli do trzech miejsc to używasz tak:

constexpr int PRECISION = 3;
const double rounded = roundValue(134.2134554, PRECISION);
std::cout << std::setprecision(PRECISION) << rounded;
0

Wszystko zależy od kontekstu.
Klasyczny problem to rozliczania bankowe. Jeśli jednotą są złotówki i użyte zostanie double to błędy zaokrągleń mogą być dla banku sporym problemem idącym w miliony.
Jeśli masz podobny przypadek to najprościej użyć typu całkowitego przemnożonego przez jakiś czynnik (np rozliczenia w groszach, a nie złotówkach).
Jeśli zakres wartości może być nieograniczony to trzeba skorzystać z jakiejś biblioteki.
Np java ma BigDecimal

1 użytkowników online, w tym zalogowanych: 0, gości: 1