Due modi che conosco, né molto intelligente, purtroppo, ma questo è più una limitazione dell'ambiente, piuttosto che me :-)
La prima è a sprintf
il numero su un grande buffer con una stringa di formato "%.50f"
, rimuovere gli zero finali e contare i caratteri dopo il punto decimale. Questo sarà limitato dalla famiglia printf
stessa. Oppure è possibile utilizzare la stringa come input dall'utente (anziché sprintf
in un valore in virgola mobile), in modo da evitare del tutto problemi di virgola mobile.
Il secondo è quello di sottrarre la parte intera quindi moltiplicare iterativamente per 10 e di nuovo sottrarre la parte intera fino a ottenere zero. Questo è limitato dai limiti della rappresentazione computerizzata dei numeri in virgola mobile - in ogni fase è possibile che si verifichi il problema di un numero che non può essere rappresentato esattamente (quindi .2155 potrebbe essere in realtà .215499999998). Qualcosa di simile a quanto segue (non testato, tranne che nella mia testa, che è circa alla pari con un COMX-35):
count = 0
num = abs(num)
num = num - int(num)
while num != 0:
num = num * 10
count = count + 1
num = num - int(num)
Se si conosce il tipo di numeri si otterrà (ad esempio, saranno tutti Da 0 a 4 cifre dopo il punto decimale), è possibile utilizzare "trucchi" in virgola mobile standard per farlo correttamente. Per esempio, invece di:?
while num != 0:
uso
while abs(num) >= 0.0000001:
Puoi chiarire "quanti decimali ha il numero"? Vuoi dire, quante cifre decimali sono nella parte frazionaria del numero? – Doug
Sì, la tua ipotesi è corretta. – Milan