I float sono soggetti al round error cioè perdono un po' di precisione via via che si eseguono calcoli. Per esempio 0.1 + 0.1 ... (per 10 volte) non farà 1 ma 0.9999999.

Per cui conviene evitare di usare nd.
La soluzione è molto semplice: nd viene usato per calcolare il resto tra n e 10 ma basterebbe usare l'operatore modulo (%)! Inoltre la condizione del while è leggermente sbagliata, in quanto basterebbe che n > 0 perché il resto funziona anche con numeri compresi tra 0 e 9.

Ho scritto questo un po' di tempo fa, dovrebbe funzionare.

codice:
string int_to_str( int n )
{
    if(!n)
        return "0";

    string s;
    string tmp;

    while ( n > 0 )
    {
        s += n % 10 + 48;
        n /= 10;
    }

    tmp = s;

    for (int i = s.size() - 1; i >= 0; i-- )
        s[i]= tmp[s.size() - i - 1];

    return s;
}
Edit: mi hanno preceduto