This is a known problem with the accounts system used by Bitcoin Core which is being removed.
Calling getbalance with no arguments vs calling getbalance with arguments actually uses different algorithms for calculating the balance. I would say that with no arguments (so
bitcoin-cli getbalance) is more correct than with specifying an account. It should, under normal circumstances, give you the full balance of the wallet. It uses the same function that is used for checking whether the wallet has enough funds for sending too, which is why you see an error when trying to use sendtoaddress.
There have been
several issues and pull requests discussing the strange behavior of getbalance.