Well, you can:
http://jsfiddle.net/qzbNr/6/
CSS
div.floats {
padding: 10px;
background-color: #eee;
margin: 10px 0;
}
div.floats > div {
float: left;
width: 20px;
height: 20px;
background-color: #333;
}
div.floats > div + div {
margin-left: 10px;
}
div.overflow-hidden {
overflow: hidden;
}
div.box-sizing {
width: 100%;
box-sizing: border-box;
}
div.known-width {
/* 200px - 2 * 10px of padding */
width: 180px;
}
div.calc {
width: calc(100% - 20px);
}
div.after-pseudo:after {
content: "";
display: block;
clear: both;
}
div.clear {
float: none !important;
clear: both !important;
width: 0 !important;
height: 0 !important;
margin: 0 !important;
}
HTML
<div class="floats overflow-hidden box-sizing">
<div></div>
<div></div>
<div></div>
</div>
<div class="floats overflow-hidden known-width">
<div></div>
<div></div>
<div></div>
</div>
<div class="floats overflow-hidden calc">
<div></div>
<div></div>
<div></div>
</div>
<div class="floats after-pseudo">
<div></div>
<div></div>
<div></div>
</div>
<div class="floats extra-markup">
<div></div>
<div></div>
<div></div>
<div class="clear"></div>
</div>
The overflow approach is messy, the trick is overflow hidden and defined width, you'll need to take care about the box model sizing and if you want something getting out like a tooltip or so, you'll be in troubles, but beside that is a classic, works pretty well.
The pseudo approach is the best IMHO, in fact I always have a .clear:after in my CSS.
The extra-markup approach is the worst since you need to add elements that don't mean anything and take care about other styles applying width !important or so.