W skrócie, bez szukania w dokumentacji: ponieważ idea floatów polega na tym, że element ustawiony jako float (==pływający) jest usunięty z normalnego ustawienia układu elementów na stronie. Co to oznacza? Jeśli ustawisz, jak w przykładzie, całą zawartość elementu <div> jako float, to ten element myśli, że nic w nim nie ma – bo float usuwa wszystkie <a> z miejsca, gdzie <div> je jakby "oczekuje".
Napisz, jeśli chciałbyś poparcie dokumentacji. To zawsze zabiera trochę czasu, więc gdy nie muszę, nie szukam.
UPDATE: A że w efekcie w elemencie <div> nic nie zostaje, to pusty <div> == <div> z zerową wysokością.
UPDATE 2: Jeszcze kwestia, dlaczego taki sam float ustawiony dla elementu <div> i jego zawartości rozwiązuje sprawę. Chodzi o to, że wtedy <div> jest jakby przesunięty do tego samego układu elementów, co jego zawartość. Spróbuj dać dla elementu <div> wartość float: right, dla jednego <a> też wartość float: right, a dla drugiego float: left, lub jakoś podobnie, i zobacz efekty.