Zaokrouhlování

Následující program demonstruje problémy zaokrouhlování a reprezentace čísel typu double.

Než jej spustíte, dobře si promyslete, co program dělá.

Vysvětlete, proč se výsledek liší od vašeho předpokladu. Ano, jsem si celkem dost jistý, že se lišit bude ;-).

public class Zaokrouhlovani {
    public static void main(String[] args) {
        /*
         * Změňte následující na 2, 4 nebo 5 a pozorujte rozdíly.
         * A hlavně: JE NEZAPOMEŇTE!
         */
        int kroku = 3;
        double zdibec = 1. / kroku;
        double cislo = 0.;
        for (int i = 0; i < 25 * kroku; i++) {
            if ((i % kroku) == 0) {
                double ocekavam = i / kroku;
                if (cislo == ocekavam) {
                    System.out.printf("==> %.0f je ok\n", cislo);
                } else {
                    System.out.printf("%20.16f != %20.16f\n", ocekavam, cislo);
                }
            }
            cislo += zdibec;
        }
    }
}
Licence Creative Commons
Alej.alisma.cz, jejímž autorem je Vojtěch Horký, podléhá licenci
Creative Commons Uveďte autora-Zachovejte licenci 4.0 International.