Zaokrąglanie liczb zmiennoprzecinkowych ileś miejsc po przecinku

0

Jak zaokrąglić liczby zmiennoprzecinkowe np. do 2 miejsc po przecinku? Próbowałem tak:

#include <bits/stdc++.h>
using namespace std;

int main() {
	double x = 1.035;
	x = round(x * 100) / 100;
	cout << x << "\n";
	return 0;
}

ale wynikiem jest 1.03 a nie 1.04 (prawdopodobnie ze względu na niedokładność liczb zmiennoprzecinkowych)
Jak zaokrąglać ?

1

Ogólnie to się nie da, szczególnie, na potrzeby wypisania można podać parametry podpowiem dla cout metoda precision()

0

Stworzyłem taką funkcję i teoretycznie działa

double good_round(double num, double zeros){
	num *= zeros;
	long long ll_num = num;
 
	int last_digit = (long long)ll_num % 10;
	if (last_digit >= 5)
		ll_num += 10;
 
	ll_num /= 10;
	ll_num *= 10;
 
	return ll_num / zeros;
}

https://ideone.com/MVzt8y

Czy po prostu dla innych danych zaczęła by dawać złe wyniki?

0

@Suchy702:a nie jest tak , że jak 5 na końcu to w zależności czy wcześniejsza cyfra jest parzysta zaokrągla inaczej? spróbuj z 1.045

0

@Suchy702: Najpewniej będzie przkonwertować liczbę do stringa, zaokrąglić "ręcznie" i z powrotem do double.

0

coś takiego teraz wyszukłam ale może ktoś kto ma z tym doświadczenie sie wypowie https://en.cppreference.com/w/cpp/numeric/math/rint

2
double good_round(double num, double zeros) { return round(num*zeros)/zeros; }

Z tym że i tak nie będzie to zapisane ze 100% precyzją.
Dla liczenia kasy proponuje liczyć w groszach.

0

Zaokrąglanie dziesiętne używając samego typu zmiennoprzecinkowego jest niezbyt szczęśliwym wyborem.
Ty chcesz wyświetlić zaokrąglony wynik, ergo powinieneś skorzystać z funkcjonalności strumienia które to kontrolują.
Popatrz na:

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    double x = 1.03512314;
    cout << fixed << setprecision(2) << x << "\n";
    return 0;
}

https://godbolt.org/z/Pz1r6zd3r

0

Dlaczego wypisywanie zaokrąglonej liczby działa poprawnie, ale już zapisywanie do zmiennej nie?

4

Dla mnie to trochę wygląda na XY.
Zakładanie, że we float'cie/double'u jest dokładnie ta liczba którą wpisałeś nie jest zbyt rozsądne.

0
Suchy702 napisał(a):

"... nie, chciałbym działać na zaokrąglonej liczbie, wyświetlam żeby sprawdzić czy moja funkcja działa poprawnie ..."

Dlaczego wypisywanie zaokrąglonej liczby działa poprawnie, ale już zapisywanie do zmiennej nie?

Dla tego: https://ideone.com/OTC7Dv

1

@Suchy702: Spróbuj czegoś takiego:

#include <iostream>

int main() {
    using namespace std;

    cout.setf(ios::scientific);
    cout.precision(30);

    double x = 0.1, y = 0.2, z = 0.3, s = x+y, r = s-z;

    cout << x << endl;
    cout << y << endl;
    cout << z << endl;
    cout << s << endl;
    cout << r << endl;
}

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