When you send a transaction, you specify a gas price and gas limit. If it doesn't use the entire gas limit, then you get some of the money back. So it would seem to be impossible to know beforehand what the total used gas will be, leaving spare change in every wallet.
I tried to empty my MetaMask wallet. I looked up a reasonable gas price on https://ethgasstation.info/ (7). I entered the total balance to send, MetaMask of course said 'not enough balance' due to the fee. I changed the gas price to 7, copied the maximum fee, rejected the transaction, entered a new transaction with the amount equal to (total balance - maximum fee), and again changed the gas price to 7. After it was sent (a few hours), I was left with $0.09 in my MetaMask wallet! Even though I tried to carefully calculate the exact amount, it seems like would be impossible to empty a wallet.
MetaMask help says MyEtherWallet has a 'send max' feature, but how would that work?
https://support.metamask.io/kb/article/14-sending-max-balance
An easy way to send your full balance in the meanwhile is to export your MetaMask account to MyEtherWallet, which has a "send max" feature, and send to the exchange from there.
Isn't it true that you cannot know the actual gas used ahead of time? If you try to calculate the gas limit exactly, then you risk that it uses up all your gas and your transaction still fails! (I've had that happen before.)