The idea here is to get a smooth logarithmic division of each order of magnitude (power of 10). To get x steps that perfectly divide the order of magnitude, just use the xth root of 10 as your factor. In Ruby:
And of course, if you want more aesthetically pleasing increments (like for axis markers on a logarithmic graph), just round each increment as desired. I usually find that the [1, 2, 5] series is sufficient.
Yep, that's a good way to minimize both the number of denominations offered and the number of bills/coins needed to make change for a given amount of money.
The USD is close, too. Bills are in 1, 2, 5, although the $2 bill is rare. For some reason our coins are irregular, although people in my experience find all coins a bother.
The "ideal" set of 3 denominations would be 1, 2.15, and 4.64.
That's because the highest US coin in practice is $0.25—even though $1 coins exist, they are not widespread and overlap with the $1 bill.
Contrast with the Euro where the highest coin is €2 and bills start at €5.
Also prices tend to be inclusive of sales tax / VAT in Europe, so a €9.99 widget can be purchased with a €10 bill and you get 1 single €0.01 coin in change. Whereas your $9.99 widget will be $10.79 (at 7% tax), so you'll get 3 dimes and a nickel (4x the amount of change) assuming you handed over $11. Most likely, you had a $20 so you also get lots of $1 bills with your coins. :)
Presumably 12, 24, and 48 were chosen because they are
https://en.wikipedia.org/wiki/Highly_composite_numbers, and 96 and 192
for compatibility with 48 (since the HCNs in that neighborhood — 60,
120, and 180 — aren’t divisible by 48.)
(Related joke: How do we know the Babylonians were idiots? Because
the day doesn’t have 83160 seconds.)