SQL-Server: Calcular el descuento racional

Siguiendo con la matemática financiera el otro día veíamos cómo calcular el descuento comercial en una consulta de SQL. Ahora vamos con otro tipo de descuento, el descuento racional.

El descuento racional se trata, al igual que el comercial, de una forma de descuento simple, pero tiene principalmente una diferencia con el descuento comercial: Su cálculo se efectúa a partir de la diferencia entre el monto a pagar o valor nominal y su valor actual, por lo que no se toma el valor nominal sino el valor real.Es decir, el descuento racional será igual a la cantidad a pagar menos el valor actual del capital. Es el descuento de su respectivo interés aplicado al valor nominal de un valor, calculado a partir de la tasa de interés nominal vencida o con la tasa de interés efectiva vencida.

La fórmula para obtener el descuento sería la siguiente:

D = ( C0 * d * t ) / (1 + d * t)

Siendo C0 es el capital inicial en el momento t=0, d la tasa de descuento que se aplicará y t el tiempo que dura la inversión. Por ejemplo, para 20000 euros a un 15% anual la fórmula sería:

D=(20000*0.15*1)/(1+0.15*1)

Entonces ¿cómo llevamos esto a una consulta SQL? Supongamos que, como en el ejemplo anterior, tenemos una tabla llamada TablaCreditos con los campos Valor (con el capital inicial en formato money), Descuento (en formato Numeric(5,2)) y Tiempo (en formato int). La consulta sería:

Select (Valor*(Descuento/100.00)*CONVERT(numeric(4,2),Tiempo))/(1.00+(Descuento/100.00)*CONVERT(numeric(4,2),Tiempo)) as DescuentoRacional from TablaCreditos

SQL-Server: Calcular el descuento comercial

La operación financiera de descuento es la inversa a la de capitalización (ya vimos en el pasado la capitalización simple y la compuesta). En este caso se calcula el capital equivalente en un momento anterior de un importe futuro.

Mientras que con la fórmula de la capitalización se calculan unos intereses que se añaden al importe principal, compensando el aplazamiento en el tiempo de su disposición, en las reglas de descuento se hace lo contrario: se calculan los intereses que hay que pagar por adelantar la disposición del capital.

La fórmula para obtener el descuento sería la siguiente:

D= N*d*t

Siendo D el descuento efectuado, N el valor nominal del crédito, d la tasa de descuento y t el tiempo. Por ejemplo, para 20000 euros a un 15% anual la fórmula sería:

D = 20000*0.15*1

Entonces ¿cómo llevamos esto a una consulta SQL? Supongamos que tenemos una tabla llamada TablaCreditos con los campos Valor (con el valor nominal en formato money), Descuento (en formato Numeric(5,2)) y Tiempo (en formato int). La consulta sería:

Select Valor*(Descuento/100.00)*CONVERT(numeric(4,2),Tiempo) as Descuento from TablaCreditos

¿Por qué un número elevado a 0 es igual a 1?

Esto se sale totalmente de la línea editorial del blog, desde luego, pero me apetecía contarlo por aquí. El caso es que en una charla de oficina comenté que una vez cuando cursaba 2º de ESO la profesora me hizo explicar en clase por qué cualquier número elevado a 0 es igual 1, y un compañero me discutió que no. Así que con 32 años me volvía a ver delante de una pizarra haciendo esta demostración:

Podemos expresar que X0 es el resultado de Xn-n siendo X cualquier número real menos el 0 y siendo n cualquier número real. O, por ponerlo con número, podemos decir 20 es el resultado de (por ejemplo) 22-2.

Entonces por propiedades de las potencias Xn-n es igual a Xn/Xn. Siguiendo el ejemplo anterior 22-2=22/22.

Por lo tanto tenemos que X0 = Xn/Xn, y siendo el numerador y el denominador iguales en la división el resultado es necesariamente 1. Es decir 20 = 22/22, por tanto 20 = 4/4. Y 4/4=1, así de simple.

¿Y en el caso del 00? Bueno, eso a mi ya me supera. Pero os dejo un enlace a otro blog donde lo explican y debaten, para que matéis vuestra curiosidad.

Recursividad: Función que calcula el factorial y programa que imprime una sucesión de Fibonacci en C o C++.

Soy débil, lo reconozco. No se decirle que no a los imperativos de una dama, tal vez por un primitivo impulso machista de querer impresionar y mostrarme como “el que todo lo soluciona”, pero eso lo dejo en manos de psicoanalistas. El caso es que me han pedido que explique la recursividad en la programación, y para qué voy a explicarlo a una sola persona si puedo ponerlo aquí y que lo lea todo el que lo necesite (aunque la verdad, si lo buscáis en Google hay miles de ejemplos).

La recursividad es un recurso (qué “rebuznante” suena ponerlo así) muy potente a la hora de programar. Una función recursiva no es otra cosa que una función que se define en función de si misma. Dicho a sí a muchos os ha sonado a chino, ya que es un concepto muy abstracto, no es algo en lo que uno piense de forma natural, no es algo intuitivo. Citando la wikipedia la recursividad es

“…la forma en la cual se especifica un proceso basado en su propia definición.”

“Un problema que pueda ser definido en función de su tamaño, sea este N, pueda ser dividido en instancias más pequeñas (< N) del mismo problema y se conozca la solución explícita a las instancias más simples, lo que se conoce como casos base, se puede aplicar inducción sobre las llamadas más pequeñas y suponer que estas quedan resueltas.”

Simplificando al máximo la definición, a nivel de programación: la recursividad es una función que se llama a si misma. Cada vez que se llama a una función, se crea un juego de variables locales, de este modo, si la función hace una llamada a si misma, se guardan sus variables y parámetros, usando la pila, y la nueva instancia de la función trabajará con su propia copia de las variables locales. Cuando esta segunda instancia de la función retorna, recupera las variables y los parámetros de la pila y continua la ejecución en el punto en que había sido llamada.

Cuando estudié la recursividad en primero de DAI, los ejemplos que tuvimos que programar fueron dos: Una función que calcula un factorial y una función que calcula una sucesión de Fibonacci. Ambos son ejemplos clásicos.

Seguramente Taboada, mi profesor de Fundamentos de la programación me mataría por resolver así la función del factorial, porque siempre insistía en que “una función sólo puede tener una salida”, pero después de tanto tiempo programando en VB.NET y en Java ya no me rompo la cabeza con eso y le pongo varias salidas aunque el ejemplo esté en C.


/*Función para un factorial, que recibe un entero*/

int factorial(int n) {
  if(n < 0) return 0; /*Si el número es negativo no se puede calcular el factorial*/
  else if(n > 1) return n*factorial(n-1); /* Recursividad, la función se llama a si misma */
  return 1; /* Si es igual a uno, devuelve uno y se termina la recursividad */
}

Podéis obviar la primera comprobación (la de si n<0) si en el main (o donde llaméis a la función por primera vez) ya comprobáis que no le estáis pasando un negativo (no se puede hacer el factorial de números negativos).

Sobre la sucesión de Fibonacci podéis informaros en ese link a la wikipedia, que es un coñazo explicarla. El programa que la calcula en C (y C++) sería el siguiente (esta vez pondré el programa completo y no sólo la función, porque da la casualidad que lo llevaba dentro del pendrive):

#include<stdio.h>

/*Programa que calcula una sucesión de Fibonacci*/
 void main(void)
 {
 int num=0;/*Entero que almace la cantidad de números a calcular*/
 int resultado=0;/*entero que almacena el resultado*/

printf("SERIE DE FIBONACCI\n");
 printf("Introduce la cantidad de numeros: ");
 scanf("%i",&num);
 printf("\t");

for(int i=0;i<=num-1;i++)
 {
   resultado = fibonacci(i);
   printf("%i ", resultado);
 }

printf("\n");
 }

/*****************************************************/
 /*Función que calcula la serie de Fibonacci*/
 int fibonacci(int n)
 {
 if (n<2)
  return n;
 else
  return fibonacci(n-1) + fibonacci(n-2);
 }

De nuevo pedir perdón por el sangrado, como en otras ocasiones, pero cuando hago copypaste desde Notepad++ o desde Notepad el wordpress no me mantiene la sangría (curiosamente desde GEDIT sí que lo mantiene, un minipunto para Linux). En todo caso, si copiáis y pegáis debería furrular.

En fin, y con esto os lego aquí este conocimiento que a mi me transmitió en su día el profesor José Taboada (aunque no estaría de acuerdo con la función del factorial, como dije antes). Espero que os sirva de utilidad.