Página 1 de 1

límite en valores numéricos.

Publicado: Dom Oct 20, 2013 1:45 pm
por XeviCOMAS
Veo que los valores de variables numéricas o directamente de números, no
recojen más de 16 dí­gitos...
¿Es eso así­???
Para el cálculo de IBAN se necesita hacer cálculos con números de 26
dí­gitos, así­ pues...
LogDebug( 12345678901234567890123456 )
deveulve 12345678901234570000000000
Redondea dí­gito 16 y pone ceros al resto... ¿?¿?
¿Alguna sugerencia???
Gracias.
Un Saludo,
Xevi.

límite en valores numéricos.

Publicado: Mar Oct 22, 2013 9:06 am
por Carlos Mora
El 20/10/2013 13:45, Xevi escribió:
> Veo que los valores de variables numéricas o directamente de números, no
> recojen más de 16 dí­gitos...
> ¿Es eso así­???
Creo que es porque el número supera la capacidad máxima de un entero,
entonces lo transforma en un DOUBLE, que tiene una mantisa limitada a 16
dí­gitos, y redondea, que es el problema
> Para el cálculo de IBAN se necesita hacer cálculos con números de 26
> dí­gitos
IBAN? Entonces hablamos de módulo 97, verdad?
No recuerdo donde lo leí­, pero el módulo tiene una propiedad particular
y curiosa, que permite calcular el módulo por partes, segmentando el
numero. si tenemos un número de por ejemplo 12 dí­gitos, podrí­amos
separar el numero en partes y calcular el módulo de cada parte y así­
calcular el modulo final:
Si el numero x es AAAABBBBCCCC y queremos calcular el modulo base n,
entonces
AAAABBBBCCCC % n = (STR((AAAA % n)+BBBBCCCC) % n
y así­ vamos reduciendo el numero en sucesivas iteraciones. Dicho en código:
//---------------------------------------------------------- --------------------
FUNCTION Modulo97( cNumero )
//---------------------------------------------------------- --------------------
WHILE Val( cNumero ) >= 97
cNumero:= LTrim(Str( ( Val( Left( cNumero, 9 ) ) % 97 ), 2 ) ) +
SubStr( cNumero, 10 )
ENDDO
RETURN Val(cNumero)
Un saludo

límite en valores numéricos.

Publicado: Mar Oct 22, 2013 3:52 pm
por XeviCOMAS
Carlos,
gracias por responder.
Me temí­a que era debido a lí­mite de dí­gitos.
De hecho me hice la función para "saltar" esta limitación en ese caso
concreto...
FUNCTION xIBAN( cCCC )
Return "ES" + PadL( ToString( 98 - Val( ToString( Val( Left(cCCC,15) ) %
97 ) + SubStr( cCCC+"142800", 16, 15 ) ) % 97 ), 2, "0" )
Un Saludo,
Xevi.
"Carlos Mora" ha escrit al missatge:526623e1$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
El 20/10/2013 13:45, Xevi escribió:
> Veo que los valores de variables numéricas o directamente de números, no
> recojen más de 16 dí­gitos...
> ¿Es eso así­???
Creo que es porque el número supera la capacidad máxima de un entero,
entonces lo transforma en un DOUBLE, que tiene una mantisa limitada a 16
dí­gitos, y redondea, que es el problema
> Para el cálculo de IBAN se necesita hacer cálculos con números de 26
> dí­gitos
IBAN? Entonces hablamos de módulo 97, verdad?
No recuerdo donde lo leí­, pero el módulo tiene una propiedad particular
y curiosa, que permite calcular el módulo por partes, segmentando el
numero. si tenemos un número de por ejemplo 12 dí­gitos, podrí­amos
separar el numero en partes y calcular el módulo de cada parte y así­
calcular el modulo final:
Si el numero x es AAAABBBBCCCC y queremos calcular el modulo base n,
entonces
AAAABBBBCCCC % n = (STR((AAAA % n)+BBBBCCCC) % n
y así­ vamos reduciendo el numero en sucesivas iteraciones. Dicho en código:
//---------------------------------------------------------- --------------------
FUNCTION Modulo97( cNumero )
//---------------------------------------------------------- --------------------
WHILE Val( cNumero ) >= 97
cNumero:= LTrim(Str( ( Val( Left( cNumero, 9 ) ) % 97 ), 2 ) ) +
SubStr( cNumero, 10 )
ENDDO
RETURN Val(cNumero)
Un saludo