C ++ Gleitkommapräzision [duplizieren]

Mögliches Duplizieren:
Floating Point Ungenauigkeit Beispiele

double a = 0.3;
std::cout.precision(20);
std::cout << a << std::endl;

result: 0.2999999999999999889

double a, b;
a = 0.3;
b = 0;
for (char i = 1; i <= 50; i++) {
  b = b + a;
};
std::cout.precision(20);
std::cout << b << std::endl;

Ergebnis: 15.000000000000014211

So .. 'a' ist kleiner als es sein sollte. Aber wenn wir 50 mal 'a' nehmen, wird das Ergebnis größer sein als es sein sollte.

Warum ist das? Und wie bekomme ich in diesem Fall das richtige Ergebnis?