The fee is based on the transaction size, not on the amount of money being sent. Making a transaction works by spending money you've previously received; the Bitcoin client looks for unspent incoming transactions and links those together to form a new transaction that uses up the money from those old transactions.
If this number of input transactions is particularly large (for instance, if you've received a lot of very small amounts of money), this means that the transaction size becomes larger, making the required fee larger as well, since it is a bigger burden on the network. I believe some Bitcoin clients do have a tendency to try and use up small transactions first, which further contributes to creating larger transactions.
If the transaction you're trying to make is particularly small, the fee may seem disproportionally large. This is why Bitcoin is often not considered to be great for microtransactions.
According to the Bitcoin wiki, the fee used in the reference implementation (as of 0.8.2) is 0.0001 BTC per thousand bytes.
Of course, the specifics of calculating the fee depends on the client, and this is configurable in any decent client. I've gotten away in the past with using a fee of 0.
I don't think the QR code would say how much of a transaction fee to give. (in the bitcoin URI scheme format no fees can be specified) Your app probably just chose a large number.
– Tim S. – 2014-01-13T18:10:13.4971Your app's transaction fee is set to 0.0005 BTC. – David Schwartz – 2014-01-13T22:56:41.377
The cost the network incurs is per transaction and not proportional to the amount of money you transfer, so it's only natural to have fee be an absolute not a relative value. – CodesInChaos – 2014-01-14T09:58:52.150