I Moduli in PHP

Gli argomenti di questa pagina

  • L'Operatore %
  • La funzione fmod()
  • Gli esempi eseguiti coi due metodi

L'Operatore %

Molte divisioni danno un resto. Ebbene nei linguaggi di programmazione c'è una funzione apposta o un operatore che restituiscono un resto senza eseguire la divisione e questo viene chiamato MODULO. In PHP c'è l'operatore % che è chiamato MODULO.

La sintassi di questo operatore è: dividendo % divisore
Da notare che l'operatore % funziona in maniera sufficientemente corretto coi numeri interi.

Gli operandi di un MODULO vengono convertiti in numeri interi (eliminando la parte decimale) prima della lavorazione. Per questo motivo è da notare che l'operatore % funziona in maniera sufficientemente corretta coi numei interi. Coi numeri decimali, per via della preventiva conversione in numeri interi degli operandi, il risultato può non essere attendibile.

Facendo delle prove ho avuto conferma che questo metodo non è sempre preciso, per esempio come il RESTO di excel o la funzione MOD del VBA, e questa cosa, in calcoli che richiedono precisione può condurre in errori di calcolo.
Vediamo alcuni esempi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$numbers 
= array (
4219.11,
843.822,
16300.35,
19367.28,
0,
421911,
843822,
1630035,
1936728
);
$divider 7;
for (
$i 0$i count ($numbers); $i++) {
    echo 
$numbers[$i] % $divider;
}
?>

Qui sotto alcuni esempi ed alcune verifiche fatte alla maniera scolastica edeguendo prima una divisione tra i due numeri e quindi la verifica con la verifica con una moltiplicazione
Evidenziati in rosso sono i risultati fondamentalmente errati ottenuti con dividendo decimale.

Con l'operatore %
# I risultati ottenuti col divisore 7 La semplice divisione Verifica
Le formule usate
# $module = $numbers[$i] % 7; $quoz = $numbers[$i] / 7; $verif = intval($quoz) * 7 + $module;
1-A 4219.11 % 7 = 5 4219.11 / 7 = 602.73 602.73 * 7 + 5 = 4219
2-A 843.822 % 7 = 3 843.822 / 7 = 120.546 120.546 * 7 + 3 = 843
3-A 16300.35 % 7 = 4 16300.35 / 7 = 2328.6214285714 2328.6214285714 * 7 + 4 = 16300
4-A 19367.28 % 7 = 5 19367.28 / 7 = 2766.7542857143 2766.7542857143 * 7 + 5 = 19367
5-A 0 % 7 = 0 0 / 7 = 0 0 * 7 + 0 = 0
6-A 421911 % 7 = 0 421911 / 7 = 60273 60273 * 7 + 0 = 421911
7-A 843822 % 7 = 0 843822 / 7 = 120546 120546 * 7 + 0 = 843822
8-A 1630035 % 7 = 1 1630035 / 7 = 232862.14285714 232862.14285714 * 7 + 1 = 1630035
9-A 1936728 % 7 = 3 1936728 / 7 = 276675.42857143 276675.42857143 * 7 + 3 = 1936728

 

La funzione fmod()

Tuttavia in PHP c'è anche una funzione che dal punto di vista della precisione di calcoli complessi è più affidabile.
Se l'operatore % lavora e restituisce solo numeri interi, la funzione fmod() lavora e restituisce valori anche con numeri decimali. Per questo motivo, se non si è sicuri di che tipo di numeri si sta lavorando, è da preferirsi l'uso della funzione fmod().

La sintassi è: fmod(dividendo, divisore).
I due argomenti sono obbligatori

Questa funzione viene utilizzata per calcolare il resto di una divisione in cui uno (o entrambi) degli operandi ha decimali e restituisce il resto decimale di una divisione.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$numbers 
= array (
4219.11,
843.822,
16300.35,
19367.28,
0,
421911,
843822,
1630035,
1936728
);
$divider 7;
for (
$i 0$i count ($numbers); $i++) {
    
$module fmod($numbers[$i], $divider);
}
?>

Qui sotto alcuni esempi ed alcune verifiche fatte alla maniera scolastica edeguendo prima una divisione tra i due numeri e quindi la verifica con la verifica con una moltiplicazione
Come è facilmente notare, si osserva che ora tutti i resti ottenuti con la funzione fmod() sono fondamentalmente esatti

Ora con la funzione fmod()
# I risultati ottenuti col divisore 7 La semplice divisione Verifica
Le formule usate
# $module = fmod($numbers[$i], 7); $quoz = $numbers[$i] / 7; $verif = intval($quoz) * 7 + $module;
1-B fmod(4219.11, 7) = 5.1099999999997 4219.11 / 7 = 602.73 602.73 * 7 + 5.1099999999997 = 4219.11
2-B fmod(843.822, 7) = 3.822 843.822 / 7 = 120.546 120.546 * 7 + 3.822 = 843.822
3-B fmod(16300.35, 7) = 4.3500000000004 16300.35 / 7 = 2328.6214285714 2328.6214285714 * 7 + 4.3500000000004 = 16300.35
4-B fmod(19367.28, 7) = 5.2799999999988 19367.28 / 7 = 2766.7542857143 2766.7542857143 * 7 + 5.2799999999988 = 19367.28
5-B fmod(0, 7) = 0 0 / 7 = 0 0 * 7 + 0 = 0
6-B fmod(421911, 7) = 0 421911 / 7 = 60273 60273 * 7 + 0 = 421911
7-B fmod(843822, 7) = 0 843822 / 7 = 120546 120546 * 7 + 0 = 843822
8-B fmod(1630035, 7) = 1 1630035 / 7 = 232862.14285714 232862.14285714 * 7 + 1 = 1630035
9-B fmod(1936728, 7) = 3 1936728 / 7 = 276675.42857143 276675.42857143 * 7 + 3 = 1936728

 

Gli esempi eseguiti coi due metodi

Gli esempi sono stati eseguiti usando sia l'operatore % che la funzione fmod().
Per entrambi uso nove numeri: un primo gruppo di quattro numeri decimali, uno 0 (zero) e un secondo gruppo di quattro numeri interi. Per ogni riga eseguo queste operazioni:

  • trovo il MODULO
  • visualizzo il risultato
  • eseguo la normale divisione tra i due operandi
  • visualizzo il risultato
  • faccio la verifica per testare la validità del modulo ottenuto con l'operazione inversa sulla divisione (parte intera del quoziente X divisore + modulo (resto) )
  • visualizzo il risultato

Se per il secondo gruppo di numeri (i numeri interi) il riscontro è positivo con entrambi i metodi usati (operatore % e funzione fmod() ), per il primo gruppo (numeri decimali) viene evidenziato la non coerenza del riscontro:
l'operatore % fallisce
la funzione fmod() risulta corretta

Per lo 0 (zero) il risultato è sempre ovvio: uno 0 diviso per altro qualsiasi numero da sempre come risultato uno 0 con resto di 0.

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum