The difference seems to come from the limited floating point precision.
Note that gradcheck 3 will also use a tolerance value to check the gradients.
How reproducible is the convergence issue using these two approaches, i.e. are you able to get a lower loss using the first approach every time you run the code?