nro de decimales

07/08/2007 - 21:34 por Ivan | Informe spam
hola a todos,

¿sabeis si existe una forma de obtener el (posible) nº de decimales de
un numero?

de momento uso esto, que parece funcionar, pero me da la impresion de
que debe de haber alguna forma mas directa (¿matematica?), sin tener
que recurrir a las funciones de texto. Aunque no he logrado
encontrarla.

Public Function Nro_Decimales(ByVal nro As Double) As Integer
On Error Resume Next
If InStr(nro, Application.DecimalSeparator) > 0 Then _
Nro_Decimales = Len(CStr(nro)) - _
InStr(nro, Application.DecimalSeparator)
End Function

sobre todo es curiosidad, pero gracias por anticipado

un saludo
Ivan

Preguntas similare

Leer las respuestas

#6 Ivan
08/08/2007 - 21:24 | Informe spam
hola, lo primero, muchas gracias por la aportacion

en realidad, se me ha pasado especificarlo, pero me interesa por codigo ( a nivel un poco esperimental).

En cualquier caso añado tu aporte a mi coleccion, aunque [y no me hagas mucho caso] creo que convendria usar 'Truncar'
mejor que 'Entero', pues si no me equivoco, con esta se podria correr algun riesgo de redondeo, con la consiguiente
ruptura de la igualdad

por otro lado, la idea era buscar alguna forma sin recurrir a las funciones de texto, sobre todo en el caso de que
existiera algun tipo de funcion aplicable de forma sencilla.

en mis practicas a lo mas que he llegado a sido a la macro que pongo a continuacion ( aunque su aplicacion no creo que
sea mejor/mas eficiente que las ya mencionadas en el hilo, y de hecho yo seguramente seguire usando las otras en lo que
estoy haciendo)

es posible que exista alguna forma de evitar el bucle(¿logaritmos, raices, , ? no tengo ni idea, apenas pase de la
raiz cuadrada) pero ahi va solo como curiosidad:

Public Function nDecimales(ByVal nro As Double) As Integer
Dim n As Integer, intMult As Double
If Int(nro) = nro Then Exit Function
Do
n = n + 1: intMult = nro * (10 ^ n)
Loop Until Int(intMult) = intMult Or n = 12
nDecimales = n
If Int(intMult) <> intMult Then _
MsgBox "El nº tiene mas de 12 decimales." & vbCr & _
"Se devuelve 12 como maximo admitido" & vbCr & _
"por esta funcion"
End Function

NOTA: es curioso, aunque devuelve hasta 15 decimales, en el nº 13 se le va la olla y devuelve 14, al menos si acaba la
serie de numeros decimales es esta:

1,1234567890123

sin embargo si quitamos el 3 o añadimos un 4 devuelve la cantidad correcta. Una rareza mas

un saludo y si se os ocurre alguna forma mas pues bienvenida sea

Ivan
Respuesta Responder a este mensaje
#7 Ivan
09/08/2007 - 01:14 | Informe spam
hola de nuevo, Hector

si tienes tiempo y ganas, y solo por aprender un poco mas (e intentar
recortar unos milimetros el abismo entre el KISS y yo), como
simplificarias esta funcion, que es la que estoy usando para obtener
el maximo nº de decimales entre 2 numeros :

''
Public Function DecimalesDosNros(ByVal nro_1 As Double, _
ByVal nro_2 As Double) As Integer
Dim nDec1 As Integer, nDec2 As Integer
nDec1 = InStr(1, nro_1, Application.DecimalSeparator)
If nDec1 > 0 Then nDec1 = Len(CStr(nro_1)) - nDec1
nDec2 = InStr(1, nro_2, Application.DecimalSeparator)
If nDec2 > 0 Then nDec2 = Len(CStr(nro_2)) - nDec2
DecimalesDosNros = Evaluate("=max(" & nDec1 & "," & nDec2 & ")")
End Function

lo dicho, solo por aprender y si tienes tiempo

un saludo
Ivan
Respuesta Responder a este mensaje
#8 Héctor Miguel
09/08/2007 - 03:48 | Informe spam
hola, Ivan !

... solo por aprender un poco mas (e intentar recortar unos milimetros el abismo entre el KISS y yo)
como simplificarias esta funcion, que es la que estoy usando para obtener el maximo nº de decimales entre 2 numeros :



1) me 'ahorraria' [aunque sea un poco de] memoria con las variables 'no indispensables', los tipos asignados a las mismas
y dejando de pasar los argumentos ByVal [ya que no se estan modificando los valores 'pasados']

2) me 'ahorraria' la busqueda de cual pudiera ser el carater separador de decimales de la configuracion regional [ademas]...
-> Application.DecimalSeparator en las versiones anteriores requiere: Application.International(xlDecimalSeparator)
ya que para vba [siendo US-centric] funciones como Val(), Format(), etc. solo 'reconocen' punto=decimales y coma=miles
[con lo anterior, solo requieres una linea de codigo] :))

Function MaxDec2Num(n1 As Double, n2 As Double) As Byte
MaxDec2Num = Application.Max( _
Len(CStr(n1)) - InStr(Val(n1), "."), _
Len(CStr(n2)) - InStr(Val(n2), "."))
End Function

si cualquier duda... comentas ?
saludos,
hector.

__ el codigo expuesto __
Public Function DecimalesDosNros(ByVal nro_1 As Double, _
ByVal nro_2 As Double) As Integer
Dim nDec1 As Integer, nDec2 As Integer
nDec1 = InStr(1, nro_1, Application.DecimalSeparator)
If nDec1 > 0 Then nDec1 = Len(CStr(nro_1)) - nDec1
nDec2 = InStr(1, nro_2, Application.DecimalSeparator)
If nDec2 > 0 Then nDec2 = Len(CStr(nro_2)) - nDec2
DecimalesDosNros = Evaluate("=max(" & nDec1 & "," & nDec2 & ")")
End Function
Respuesta Responder a este mensaje
#9 Ivan
09/08/2007 - 23:17 | Informe spam
hola Hector,

aunque creo que va a sonar a adulacion, coba o peloteo (como se dice
por aqui), no tengo mas remedio que decirlo de nuevo: me vuelves a
dejar alucinado con tu capacidad para [ya que estamos] 'kissear'. En
tan poquito espacio, no veas lo que metes (tanto a nivel de codigo
como de explicaciones).

el 1er punto creo que lo voy a usar para abrir un decalogo sobre el
tema(kiss),

y en cuanto al 2º, a ver si sirve para evitarme algun que otro
'patinazo' con las dichosas configuraciones regionales y los
separadores [en general, lo que comentas lo se (sobre todo gracias a
ti), pero cuando llega el momento de aplicarlo me empiezan a entrar
las dudas/miedos y acabo haciendo lo que consigo que funcione al
menos aparentemente, que puede no ajustarse demasiado a lo que
deberia. Pero ya se sabe, el miedo(unido a la ignorancia) es un
poderoso freno].

en cuanto a la funcion,poco se puede decir que no sea evidente: una
maravilla (al menos para mi)

bueno, muchisimas gracias como siempre (y a ver si consigo tenerlo tan
claro como ahora cuando este delante del editor)

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#10 Ivan
09/08/2007 - 23:25 | Informe spam
hola de nuevo, Hector, como siempre se me escapaba algo

¿desde que version es valido 'DecimalSeparator?

gracias en cualquier caso
un saludo
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida