Pregunta
Cómo obtener la longitud fracción? Si es posible, sin necesidad de utilizar operación de cadena o el lazo
should all return length of 3:
5.234
5.23400
5.234000
Se acepta cualquier lenguaje de programación
[EDIT]
No es una tarea, Quiero mostrar fracciones en su mínimo. Ejemplo, I define numérico (18,8) en la base de datos. Si el usuario ha introducido solamente 5.234, los datos guardados en la base de datos es 5,23400000. Sólo quiero mostrar de nuevo como única 5.234
Solución
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")
No hay operaciones de cadena, no hay bucles.
EDIT:
BTW, para hacer esto con un bucle:
result = 0
Do While (Int(num) !> num)
num *= 10
result += 1
Loop
Return result
Un poco más elegante
Otros consejos
Dado que usted está preocupado acerca de exhibición o representación interna no, ¿por qué no despojar a los 0s se arrastran?
#!/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";
Puede optimizar tanto, probablemente en una sola expresión regular.
En la parte no fracción, la longitud es:
int((ln(v)/ln(10))+.999)
siempre que v> 1 donde ln () es el logaritmo natural y int () siempre redondea hacia abajo. Para v == 1, ln (v) devuelve 0, por lo que debe manejar esto en un caso especial.
Debería ser posible lograr lo mismo para la parte fraccionaria (v - int(v)
) pero mi matemáticas me falla.
Sólo implementar el algoritmo de la división. Y se detiene cuando el recuento de número> 7 u 8 dígitos (por float32)
Cuando se utiliza Java y JDBC, obtener el valor medio de ResultSet.getBigDecimal () . Para obtener la escala correcta, utilice el código (Java 5 y hasta; hay un error en Java 1.4 que lo hace fallar por "0.0"):
int precision = v.stripTrailingZeros().scale();
En Java 1.4, consulte esta página .
En Java:
Double.valueOf("5.34000").toString();
Asumo, es posible que desee convertir la cadena en el doble de todos modos.