1
Anzitutto va premesso che quello e` uno sfondo che riempie una determinata area definita da un oggetto (nel tuo caso un <div>.
Se il <div> non ha dimensione definita, anche lo sfondo sparisce.

2
Dando una dimensione %, la % e` riferita al blocco che contiene quello su che stiamo lavorando.

Quindi una dimensione % non ha senso se il blocco contenitore non ha dimensione definita. E la cosa e` ricorsiva fino al body e al html (in alcuni browser sono due elementi distinti, per cui vanno dimensionati ambedue)

Riassumendo: per dare una dimensione % occorre che il contenitore abbia la stessa dimensione definita; se anche questa e` %, la cosa va a sua volta riferita al suo contenitore ecc.

3
I float non riempiono il contenitore, ma si pongono al di fuori di esso (flottanti, appunto). Si puo` farli rientrare, inserendo dopo i blocchi float un blocco con il clear corrispondente.