This is likely due to sync. I'll try my best to explain.
When you send GivePlayerMoney, it sends a packet of information to the client to set their money to whatever you set it to. During the time that the instruction is being sent (such as directly after, in your case), the money will still be the old one because the 'change' instruction hasn't been recieved by the client at that time.
When you use GetPlayerMoney, it doesn't send a packet to the client requesting the money, but instead the money is saved on the server (synced) every time OnPlayerUpdate is called, hence the new money amount will only be returned by GetPlayerMoney after (or on) the next OnPlayerUpdate call.
The same applies for many different functions such as health, armour and weapons, and was a pain in the ass when scripting an anti-cheat, as I had no idea.
Hopefully that sums it up for you. Here's a great topic:
https://sampforum.blast.hk/showthread.php?tid=184118