Jeśli podwójny typ obsługuje liczby 4,35 i 435, dlaczego wartość 4,35 * 100 wynosi 434.99999999999994? [duplikować

To pytanie ma już odpowiedź tutaj:

Czy matematyka zmiennoprzecinkowa jest zepsuta? 28 odpowiedziRounding osobliwość - co wyróżnia „100”? 2 odpowiedzi

Rozumiem, że niektórych liczb nie można dokładnie przedstawić w postaci binarnej i dlatego arytmetyka zmiennoprzecinkowa czasami daje nam nieoczekiwane wyniki; jak 4,35 * 100 = 434,99999999999994. Coś podobnego do tego, co dzieje się z 1/3 po przecinku.

To ma sens, ale to powoduje kolejne pytanie. Wydaje się, że w systemie binarnym zarówno 4,35, jak i 435 mogą być reprezentowane z dokładnością. To wtedy przestaje mieć dla mnie sens. Dlaczego 4,35 * 100 to 434,99999999999994? 435 i 4.35 mają dokładną reprezentację w dynamice typu podwójnego:

double number1 = 4.35;
double number2 = 435;
double number3 = 100;
System.out.println(number1); // 4.35
System.out.println(number2); // 435.0
System.out.println(number3); // 100.0
// So far so good. Everything ok. 

System.out.println(number1 * number3); // 434.99999999999994 !!!
// But 4.35 * 100 evaluates to 434.99999999999994

Czemu

Edycja: to pytanie zostało oznaczone jako duplikat i nie jest. Jak widać w zaakceptowanej odpowiedzi, moje zamieszanie dotyczyło rozbieżności między wartością rzeczywistą a wartością drukowaną.

questionAnswers(4)

yourAnswerToTheQuestion