Zaokrąglanie przy wyświetlaniu i rzutowanie na inta, to dwie różne sprawy.
Jak wyświetlisz printf("%.20f", d) to nadal będzie 2.03…?
Warto też podejrzeć wartość takiej zmiennej w debuggerze.
Przy wyświetlaniu wykonywane jest odpowiednie zaokrąglenie, więc wartość 2.02999 - > 2.03.
Podczas rzutowania na inta, część dziesiętna jest odcięta a całkowita trafia do inta bez żadnego zaokrąglania. Dlatego 1.999999999999999999 to wciąż 1 podczas rzutowania.
I dlatego tak trudne są zadania, gdzie wartości zmiennoprzecinkowe i całkowite przeplatają się nawzajem.