Przyczyna jest prosta :)
Gdy masz wyrażenie:
a=(2*i-5)/4;
Program najpierw oblicza wartość tego po prawiej stronie znaku równości, a następnie obliczoną wartość przypisuje do zmiennej a. Czyli najpierw sobie liczy na liczbach całkowitych np. : (2 * 1 - 5 ) / 4 = -3/4 = 0, a następnie przypisuje to do zmiennej a, żeby temu zapobiec wystarczy jak napiszesz chociażby:
a = (2 * (float)(i) - 5) / 4;
lub
a = (2 * i - 5) / 4.0;
Drugie rozwiązanie, które zaproponowałeś gdzie iterator i sam w sobie jest zmienną typu float niestety nie jest poprawne. W komputerze wartości typów rzeczywistych przechowywane są z pewną dokładnością... dlatego na przykład może się zdarzyć, że 9.0 + 1 = 9.99998 zamiast 10.0 i Twój program nie będzie działać poprawnie.
Pozdrawiam,