Miejsce po przecinku

Odpowiedz Nowy wątek
2019-05-16 11:43

Rejestracja: 1 rok temu

Ostatnio: 1 rok temu

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

Pozostało 580 znaków

2019-05-16 11:47

Rejestracja: 11 lat temu

Ostatnio: 3 tygodnie temu

0

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

zamiast dzielić niech też pomnoży (przez ułamek) - kaczus 2019-05-16 12:49

Pozostało 580 znaków

2019-05-16 12:03

Rejestracja: 1 rok temu

Ostatnio: 10 minut temu

0

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

Pozostało 580 znaków

2019-05-16 12:37

Rejestracja: 1 rok temu

Ostatnio: 1 rok temu

0

Dzięki.

Pozdrawiam

Pozostało 580 znaków

2019-05-16 14:01

Rejestracja: 5 lat temu

Ostatnio: 23 minuty temu

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?

Taki "urok" liczb zmiennopozycyjnych https://wandbox.org/permlink/nIUipKbqpiDdOrUg Pozostaje sposób @daniel1302 - Delor 2019-05-16 14:14

Pozostało 580 znaków

2019-05-16 14:27

Rejestracja: 5 lat temu

Ostatnio: 31 minut temu

Lokalizacja: Łódź

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ą.


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Pozostało 580 znaków

2019-05-16 15:39

Rejestracja: 11 lat temu

Ostatnio: 2 minuty temu

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;

edytowany 5x, ostatnio: several, 2019-05-16 15:47

Pozostało 580 znaków

2019-05-16 16:00

Rejestracja: 12 lat temu

Ostatnio: 3 minuty temu

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Odpowiedz

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