If you try to program a game simulation based on how the real world works then you are going to run into some big problems when it comes to how much information a computer can process.
Take for instance the following page which is an attempt to calculate how many atoms there are in a grain of sand.
I've seen lots of problems like this from studying chemistry and physics and the ridiculously high number that the person on this page came to is in the ball park of what I've seen various teachers and textbooks come up with. -> 78 000 000 000 000 000 000
Even if this is way off and you remove 6 of those zeroes then you will still have a number that is way too big for the average computer to handle at interactive rates. Especially when there are 1000's of these transactions taking place at any given time.
How could we possibly calculate and track the momentum, positions, velocity, instantaneous accelerations, field charges, etc, of every atom in every grain of sand on a beach if just one grain has 78 000 000 000 000 000 000 individual components. (Or even more if you consider the sub-atomic components.)
I once read an nVidia graphics programming document that stated something like the following.
Do what gives the best approximation of looks good because no one will really be able to tell if the simulation is not 100% accurate. Efficiency has to be taken into consideration.
The same applies for every type of game simulation even if it does not have to do with graphics. You should probably only do the bare minimum of what it takes to get things working. If you go all out here then you will bury the computer in complexity that it cannot handle.
You will also have to write and try and maintain code of this complexity.
You could give unique serial numbers to every unit of currency but you will use up all the computer's resources just on this one detail.
Maybe a better way to handle this is to give only 1 unique identifying for each transaction.
So player #1 pays player #2 $1000000.
If you give each dollar a unique identifier, many people's computers will start to have big problems, not to mention all the network traffic and the lag this will cause.
Or you can just create one value that represents the entire transaction.
uint transferFunds_Player1ToPlayer2 = 1000000;
Even a 20 year old pocket calculator can handle something like this.