Also, people think they're getting a deal when they buy bulkier items. For example, here in my town, you can buy a five ounce can of tuna for, say, 79 cents. That's 15.8 cents per ounce. The twelve ounce can goes for $1.98. Although the tags on the shelf mention the per-ounce price in addition to the full price, people will buy the twelve ounce can. Now maybe there are other reasons to over pay- don't want to open two cans later; 10 onces is too little, 15 ounces is too much. But it's probably the psychology of "more is better" overriding reason's "lower price per ounce."
It's not necessarily about "bad at math" - it's about psychology. Ask Wal-Mart - there's a reason all their prices end in certain numbers and seldom the 'standard' numbers. For example, you'll often see $x.44, or $x.92, but seldom x.95 or x.99. I don't know the precise reasons because Wal-Mart won't discuss it. Suffice it to say "psychology."
What ultimately irritates me about this, the price will go up on a box of Cap'n Crunch over the course of three months. Then suddenly "20% more for free!" get stamped on a larger box at that higher price.