Czy to jakieś czary? setprecision

0
#include <iostream>
#include <iomanip>

int main()
{
	double a = 115.965;
	std::cout << a << std::endl;
	std::cout << std::setprecision(3 + 2) << a  << std::endl;

	double b = 248.515;
	std::cout << b << std::endl;
	std::cout << std::setprecision(3 + 2) << b << std::endl;

	std::cin.get();
	return 0;
}

115.965
115.97
248.51
248.51

Dlaczego takie odpowiedzi pokazuje? W ogóle tego nie rozumiem. Skoro jest "piątka" to powinno zaokrąglić w górę, a tu że tego nawet nie robi to jeszcze od razu ucina. Swoją drogą jak napiszę samo:

#include <iostream>
#include <iomanip>

int main()
{
	double b = 248.515;
	std::cout << b << std::endl;
	std::cout << std::setprecision(3 + 2) << b << std::endl;

	std::cin.get();
	return 0;
}

To odpalając program mam:
248.515 - przed zaokrągleniem
248.51 - po zaokrągleniu

0

setprecision(5) - zaokrąglenie do 5 cyfr znaczących

248.51
^^^ ^^
||| |+- 5. cyfra znacząca
||| +-- 4. cyfra znacząca
||+---- 3. cyfra znacząca
|+----- 2. cyfra znacząca
+------ 1. cyfra znacząca

Jeśli chcesz mieć setprecision cyfr po przecinku, użyj także std::fixed:

cout << fixed << setprecision(5) << 248.515;
248.515000
0

Właśnie chciałbym mieć tylko 2 cyfry po przecinku i nie wiem dlaczego, jak jest 5 to zaokrągla w dół a powinno w górę przecież.

2

Zaokrągla dobrze, problem jest taki, że nie da się w IEEE 754 bezstratnie zapisać liczby 248.515. Na moim systemie jest to tak naprawdę:

<@KrzaQ> << fixed << setprecision(50) << 248.515
<+cxx> 248.51499999999998635757947340607643127441406250000000

Jeśli chcesz 2 cyfry po przecinku to cout << fixed << setprecision(2) << value.

0

Bardzo dziękuję za pomoc.

1

W sieci jest dostępna na licencji MIT implementacja liczb dziesiętnych o zadanej precyzji bazująca na 64-bitowych intach, która pozwala na wybranie sposobu zaokrąglania. Co szczególnie fajne, jest ona zaimplementowana wyłącznie na template’ach i składa się wyłącznie z nagłówka: https://github.com/vpiotr/decimal_for_cpp
Być może będzie odpowiednim dodatkiem do Twojego projektu.

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