Finanza personale: il magico mondo delle percentuali, parte 1

Posted on Mar 24, 2022

Dato un numero reale C (“C” come capitale), come se ne calcola il valore percentuale P? Per esempio: quanto vale il 3% di 100,0? Indicando con R il risultato, ci si può ricordare dalle scuole inferiori la filastrocca sulle proporzioni:

R sta a C come P sta a 100

in formula, con la notazione delle scuole elementari:

R : C = P : 100

mentre con la notazione delle scuole medie inferiori:

R / C = P / 100

ricordando un po’ di geometria: sfruttiamo la teoria della similitudine tra figure geometriche piane per costruire una rappresentazione geometrica come similitudine tra rettangoli (non in scala):

 --------------            --------------
|              | P        |              | R
 --------------            --------------
      100                         C

il significato della proporzione è: il rettangolo delle percentuali con base 100 e altezza P è simile al rettangolo dei numeri reali con base C e altezza R (come sono figo!).

Con le posizioni C = 100,0 e P = 3, il risultato R vale:

C = 100,0
P = 3
R = C * P/100 = 100,0 * 3/100 = 3,0

E se vogliamo calcolare quanto vale l’aumento percentuale P di C? Il risultato R vale:

C = 100,0
P = 3
R = C * (1 + P/100) = 100,0 * (1 + 3/100)
  = 100,0 * (100/100 + 3/100) = 100,0 * 103/100
  = 103,0

Nel seguito userò la notazione del linguaggio di programmazione C per scrivere le formule matematiche; inoltre userò un po’ di notazione del linguaggio di marcatura LaTeX per i simboli delle variabili matematiche, facendola però coincidere con la sintassi del linguaggio C. Un po’ mi irrita usare il punto invece della virgola per separare i decimali, ma la vita è dura. Mi piace l’idea che le espressioni simboliche si possano copiare e incollare in un programma C per verificarne la correttezza; in fondo, abbiamo tutti sottomano un compilatore C… nevvero?

Cercherò anche, se ne avrò voglia, di scrivere esplicitamente i passaggi delle elaborazioni matematiche, perché credo siamo in molti a essere arrugginiti nell’elaborazione delle espressioni.

Siccome nessuno legge preliminarmente ciò che scrivo: spero di non fare errori. Ognuno si arrangi.

Nei seguenti calcoli si parte con un valore C e lo si modifica applicando variazioni percentuali; i vari numeri sono indicati con C_0, C_1, eccetera, dove C_0 si legge “C con zero” o semplicemente “C zero”.

Con ciò, posto il valore iniziale C_0 = 100.0 e indicando il valore aumentato della percentuale P come C_1, il calcolo sopra si scrive:

C_0 = 100.0
P   = 3
C_1 = C_0 * (1 + P/100)
    = 100.0 * (1 + 3/100)
    = 100.0 * (100/100 + 3/100)
    = 100.0 * 103/100 = 103.0

Supponiamo di aumentare il valore iniziale C_0 di una percentuale P_1 e poi di una percentuale P_2; risulta:

C_1 = C_0 * (1 + P_1 / 100)
C_2 = C_1 * (1 + P_2 / 100)
    = C_0 * (1 + P_1 / 100) * (1 + P_2 / 100)

sviluppiamo separatamente il prodotto tra binomi:

(1 + P_1 / 100) * (1 + P_2 / 100) =
  = (1 * (1 + P_2 / 100)) + (P_1 / 100 * (1 + P_2 / 100))
  = (1 + P_2 / 100)       + (P_1 / 100 + P_1 / 100 * P_2 / 100)
  = (1 + P_2 / 100)       + (P_1 / 100 + P_1 * P_2 / 10000)
  = 1 + P_2 / 100 + P_1 / 100 + P_1 * P_2 / 10000
  = 1 + (P_1 + P_2) / 100 + P_1 * P_2 / 10000

quindi:

C_2 = C_0 * (1 + (P_1 + P_2) / 100 + P_1 * P_2 / 10000)

In futuro svilupperemo l’interessante caso di P_1 == P_2. Per oggi, invece, esaminiamo l’interessantissimo caso: P_1 > 0, P_2 < 0; cioè: la prima variazione percentuale è un aumento, mentre la seconda è una diminuzione.

Introduciamo le seguenti posizioni, piú comode:

P > 0
M > 0
P_1 = + P
P_2 = - M

l’espressione di C_2 risulta:

C_2 = C_0 * (1 + P/100) * (1 - M/100)
    = C_0 * (1 + (P-M)/100 - P*M/10000)

si osserva che siccome la moltiplicazione gode della proprietà commutativa:

(1 + P/100) * (1 - M/100) = (1 - M/100) * (1 + P/100)

perciò non importa se prima avviene l’aumento e dopo la diminuzione oppure vice versa; il risultato non cambia.

Variazioni percentuali opposte

Può venirci in mente la domanda: cosa succede se P == M? Per esempio, se prima aumentiamo C_0 del 3% e poi lo diminuiamo del 3%? Il risultato è:

P = M
C_2 = C_0 * (1 + (P-M)/100 - P*M/10000)
    = C_0 * (1 - P * P/10000)

se P > 0:

e questo è quanto: due variazioni percentuali opposte diminuiscono il valore iniziale.

Variazioni percentuali complessivamente nulle

Altra domanda: due variazioni percentuali, una di aumento P e una di diminuzione M, come devono essere per lasciare C_2 == C_0? Torniamo all’espressione generale:

C_2 = C_0 * (1 + P/100) * (1 - M/100)
    = C_0 * (1 + (P-M)/100 - P*M/10000)

se poniamo C_2 == C_0 possiamo semplificare:

C_0 = C_0 * (1 + (P-M)/100 - P*M/10000)
  1 = 1 * (1 + (P-M)/100 - P*M/10000)
  1 = 1 + (P-M)/100 - P*M/10000
  0 = (P-M)/100 - P*M/10000

quindi:

(P-M)/100 = P*M/10000
      P-M = P*M/100

si ricordi che P > 0 e M > 0; essendo il membro di destra positivo, deve esserlo anche quello di sinistra: questa uguaglianza è verificata solo se P > M. Se il valore iniziale C_0 aumenta di una percentuale P, è sufficiente una diminuzione percentuale minore di P per annullare l’aumento.

Ma quant’è la differenza tra P e M? Cioè quanto vale M in percentuale rispetto a P? Indicata con D tale percentuale:

D = 100 * M/P

essendo 0 < M/P < 1 risulta 0 < D < 100; siccome:

M = 100 * P / (100 + P)

eliminando M, risulta:

D = 100 * M * 1/P
  = 100 * (100 * P / (100 + P)) * 1/P
  = 100 * 100 / (100 + P)
  = 10000 / (100 + P)

Al crescere di P: M cresce; D diminuisce, perciò M cresce piú lentamente di P; maggiore è la percentuale di aumento P, minore è la diminuzione percentuale M sufficiente ad annullare P.

Verifiche con programmi in C

Il seguente programma calcola M a partire da P in modo che C_2 == C_0:

/* demo.c --
   Compilare con: gcc -std=c99 -Wall -lm -o demo demo.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int
main (void)
{
  double P   = 10.0;
  double M   = 100.0 * P / (100.0 + P);
  double D   = 10000.0 / (100.0 + P);
  double C_0 = 1234.56;
  double C_2 = C_0 * (1.0 + P/100.0) * (1.0 - M/100.0);
  printf("P   = %11.4f%%\n", P);
  printf("M   = %11.4f%%\n", M);
  printf("D   = %11.4f%%\n", D);
  printf("C_0 = %11.4f\n", C_0);
  printf("C_2 = %11.4f\n", C_2);
  exit(EXIT_SUCCESS);
}
/* end of file */

stampa:

P   =     10.0000%
M   =      9.0909%
D   =     90.9091%
C_0 =   1234.5600
C_2 =   1234.5600

Il seguente programma calcola P a partire da M in modo che C_2 == C_0:

/* demo.c --
   Compilare con: gcc -std=c99 -Wall -lm -o demo demo.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int
main (void)
{
  double M   = 10.0;
  double P   = 100.0 * M / (100.0 - M);
  double D   = 10000.0 / (100.0 + P);
  double C_0 = 1234.56;
  double C_2 = C_0 * (1.0 + P/100.0) * (1.0 - M/100.0);
  printf("M   = %11.4f%%\n", M);
  printf("P   = %11.4f%%\n", P);
  printf("D   = %11.4f%%\n", D);
  printf("C_0 = %11.4f\n", C_0);
  printf("C_2 = %11.4f\n", C_2);
  exit(EXIT_SUCCESS);
}
/* end of file */

stampa:

M   =     10.0000%
P   =     11.1111%
D   =     90.0000%
C_0 =   1234.5600
C_2 =   1234.5600