In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

límite en valores numéricos.

Foro público de Xailer en español
User avatar
XeviCOMAS
Posts: 529
Joined: Sat Mar 12, 2011 8:16 pm

límite en valores numéricos.

Postby XeviCOMAS » Sun Oct 20, 2013 1:45 pm

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.
Un Saludo,
Xevi.
Carlos Mora
Posts: 88
Joined: Fri Jul 28, 2006 9:36 am

límite en valores numéricos.

Postby Carlos Mora » Tue Oct 22, 2013 9:06 am

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
User avatar
XeviCOMAS
Posts: 529
Joined: Sat Mar 12, 2011 8:16 pm

límite en valores numéricos.

Postby XeviCOMAS » Tue Oct 22, 2013 3:52 pm

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$1@svctag-j7w3v3j....
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
Un Saludo,
Xevi.

Return to “Spanish”