In JavaScript, perché 0,1 + 0,2 ! ! == 0.3?
In decimale, è facile memorizzare il numero 0,3 in modo pulito. Richiede solo un posto dopo il punto decimale. Ma il computer non memorizza i numeri in virgola mobile in decimale - li memorizza in binario.
In decimale, ogni posto a destra della virgola vale un decimo del posto a sinistra di essa. Quindi ha un decimo posto, poi un centesimo posto, un millesimo posto e così via. Tre decimi - che è 0,3 - si memorizza in modo pulito e piacevole nel posto dei decimi.
In binario, tuttavia, ogni posto a destra del decimale vale la metà del posto a sinistra di esso. Così il binario ha un mezzo posto, un quarto posto, un ottavo posto, un sedicesimo posto, un trentaduesimo posto, un sessantaquattresimo posto, ecc.
Il formato binario a virgola mobile dovrà memorizzare il valore come un quarto, più un trentaduesimo, e un sessantaquattresimo, e così via, avvicinandosi sempre di più a 0.3 - ma senza mai raggiungerlo esattamente.
Quindi memorizza l'approssimazione più vicina a 0.3 che può nel numero di bit che la variabile ha a disposizione, e questa approssimazione è ciò che si vede quando si ispeziona il valore nel programma.
Se avete davvero bisogno di essere in grado di memorizzare numeri decimali con precisione in un programma - ad esempio applicazioni finanziarie - ci sono alcune opzioni disponibili:
Se si conosce la massima precisione di cui avrete bisogno, si potrebbe considerare l'utilizzo del punto fisso. In virgola fissa, si usa un tipo intero per memorizzare il valore, ma si tratta l'ammontare dell'incremento come qualcosa di più piccolo di 1. Per esempio, si potrebbe memorizzare un prezzo come un intero in centesimi, o decimi/centesimi di centesimo.
Si potrebbe anche usare un formato chiamato "binary coded decimal". Utilizza quattro bit per memorizzare ogni cifra decimale - il che è in qualche modo inefficiente, perché 16 valori possono essere memorizzati in 4 bit, ma il BCD fa uso solo di 10 di quei possibili valori per memorizzare 0-9.
Se la rappresentazione precisa dei numeri decimali è ciò che è veramente importante per la tua applicazione, tuttavia, potrebbe ancora valere la pena usare questo formato nonostante l'inefficienza.