Domanda
Come ottenere la lunghezza frazione? Se possibile, senza l'utilizzo di funzionamento stringa o ad anello
should all return length of 3:
5.234
5.23400
5.234000
Ogni linguaggio di programmazione è accettato
[EDIT]
Non è un lavoro, voglio visualizzare frazioni al suo minimo. Esempio, ho definito numerico (18,8) nel database. Se l'utente ha immesso solo 5.234, i dati salvati nel database è 5,23,4 milioni. Voglio solo visualizzare indietro come 5.234 solo
Soluzione
If Int(num) = num Then Return 0
num *= 10
If Int(num) = num Then Return 1
num *= 10
If Int(num) = num Then Return 2
num *= 10
If Int(num) = num Then Return 3
num *= 10
If Int(num) = num Then Return 4
num *= 10
If Int(num) = num Then Return 5
num *= 10
If Int(num) = num Then Return 6
num *= 10
If Int(num) = num Then Return 7
num *= 10
If Int(num) = num Then Return 8
Throw New Exception("Number exceeds expected precision")
Non ci sono operazioni sulle stringhe, nessun cicli.
EDIT:
A proposito, a che fare questo con un ciclo:
result = 0
Do While (Int(num) !> num)
num *= 10
result += 1
Loop
Return result
Un po 'più elegante
Altri suggerimenti
Dato che siete preoccupati per la visualizzazione e la rappresentazione non interna, perché non basta a nudo gli 0 trascinamento?
#!/use/bin/perl
my @nums = ( '5.234', '5.23400', '5.234000' );
$_ =~ s/0+$// for @nums; # remove trailing 0s
$_ =~ s/\.$// for @nums; # remove trailing .
print "@nums\n";
Probabilmente si può ottimizzare sia in un unico regex.
Per la parte non-frazione, la lunghezza è:
int((ln(v)/ln(10))+.999)
finché v> 1 dove ln () è il logaritmo naturale e int () arrotonda sempre giù. Per v == 1, ln (v) restituisce 0, quindi è necessario gestire questo in un caso particolare.
Dovrebbe essere possibile ottenere la stessa cosa per la parte frazionaria (v - int(v)
), ma la mia matematica mi riesce.
Basta implementare l'algoritmo di divisione. E ci si ferma quando il conteggio numero> 7 o 8 cifre (per float32)
Quando si utilizza Java e JDBC, ottenere il valore tramite ResultSet.getBigDecimal () . Per ottenere la scala corretta, utilizzare questo codice (Java 5 e fino, c'è un bug in Java 1.4 che lo rende fallire per "0,0"):
int precision = v.stripTrailingZeros().scale();
Per Java 1.4, vedi questa pagina .
In Java:
Double.valueOf("5.34000").toString();
presumo, si può decidere di convertire la stringa di raddoppiare in ogni caso.