La proprietà MIN_SAFE_INTEGER di Javascript
La proprietà MIN_SAFE_INTEGER è una costante dell'oggetto Number che rappresenta il minimo intero che posso rappresentare in Javascript senza perdita di precisione.
Number.MIN_SAFE_INTEGER
E' un valore pari a -9.007.199.254.740.991 ossia -253 + 1.
Al di sotto di questo valore, il calcolo diventa inaccurato e qualsiasi operazione matematica perde di precisione nei bit meno significativi.
Perché accade? Il linguaggio Javascript rappresenta i numeri in formato binario e si basa sullo standard IEEE 754 per l'aritmetica in virgola mobile. Questo formato utilizza 64 bit per rappresentare un numero, con 1 bit utilizzato per il segno, 11 bit utilizzati per l'esponente e 52 bit utilizzati per la mantissa. Questo implica che il massimo intero sicuro è 253 - 1, mentre il minimo intero sicuro è -253 + 1. Pertanto, è necessario evitare calcoli al di fuori di questo range.
Un esempio pratico
Questo script dimostra l'esistenza di un calcolo erroneo da parte di Javascript.
<script>
let x = Number.MIN_SAFE_INTEGER
document.write(x);
let y = x*10;
document.write(y);
</script>
Lo script assegna il valore della costante MIN_SAFE_INTEGER e lo stampa.
-9007199254740991
Poi moltiplica per 10 il valore contenuto nella variabile x e assegna il risultato alla variabile y. Infine, lo stampa.
-90071992547409900
Il risultato è errato perché il prodotto per 10 dovrebbe essere -90071992547409910 mentre Javascript restituisce -90071992547409900 con dieci unità in più.
Questo calcolo inaccurato è dovuto al fatto che l'operazione si è svolta con valori interi al di fuori del range di sicurezza dello standard IEEE 754 .