You are seeing the fact that 2.2175 cannot be represented exactly in binary as most every real number cannot.

You can see this by changing your program slightly to print off more digits:

```
program prog
implicit none
real :: i
i = 2.2175
write(*,'(f10.3,f10.3)')2.2175, i
write(*,'(f20.10,f20.10)')2.2175, i
end program prog
```

When we run this:

```
(259) $ pgfortran test.F90 && ./a.out
2.217 2.217
2.2174999714 2.2174999714
```

you can see that 2.2175 is actually 2.2174999714, which, by rounding rules, is rounded up to 2.217 which is what the program did.

If you change i to be 2.298500, that is stored as 2.2985000610 and is printed as 2.299, so it would seem to round “as expected”.

Matt