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.
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.
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.
límite en valores numéricos.
Un Saludo,
Xevi.
Xevi.
-
- Mensajes: 88
- Registrado: Vie Jul 28, 2006 9:36 am
límite en valores numéricos.
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
> 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.
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
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
Un Saludo,
Xevi.
Xevi.