On a small MCU without hardware floating point support we should do as little floating point math as possible, and unless you really need the printf family of functions, try to avoid it because it bloats and slows down the code a bunch.
I suggest converting the float to an integer by first multiplying the float by 1,000.0 (assuming you want three decimal places) and then convert it to a long integer, round-off as appropriate. If you will be displaying the result on a 7-segment or dot matrix LCD then I think this format is ideal.
Let's assume that the float can be in the range 0 to 999.999 (negate if negative, save sign for display later.) The corresponding long int then has the range 0 to 999999. We will convert the number starting with the most significant digit.
Pseudo code:
dig6 = -1 // Init MSDigit
while number >= 0
number = number - 100,000
dig6 = dig6 + 1
number = number + 100,000 // Restore number, Dig 6 is done
dig5 = -1
while number >= 0
number = number - 10,000
dig5 = dig5 + 1
number = number + 10,000 // number can be switched to 16-bit here for speed
... dig4 and 3 in similar fashion
dig2 = -1
while number >= 0
number = number - 10
dig2 = dig2 + 1
dig1 = number + 10
At this point you have all six digits stored in a byte each and the minus sign saved. If you are using a 7-segment LCD, pass the digits to a 7-segment encoder function before writing to the LCD. If you are using dot-matrix display with serial interface, add 0x30 to each digit for ASCII encoding. We also need to remember the decimal point between dig4 and dig3.
This algorithm is quite fast since there is no multiplication and division involved. I have used it on tiny 4-bit MCUs with good results.