Perché 0,1 +0,2 != 0,3 in JS

Feb 25 2023
beh, questo non è un problema di js, ma ha a che fare con la capacità dei computer che possono memorizzare solo numeri interi in modo nativo, quindi hanno bisogno di un modo per rappresentare i numeri decimali. Questa rappresentazione non è perfettamente accurata.

beh, questo non è un problema js, ma ha a che fare con la capacità dei computer che possono solo memorizzare nativamente interi , quindi hanno bisogno di un modo per rappresentare i numeri decimali. Questa rappresentazione non è perfettamente accurata. Questo è il motivo per cui, il più delle volte, 0.1 + 0.2 != 0.3.

scaviamo più a fondo.

quindi l'output di 0.1 + 0.2 è 0.300000000000000004 che rispetto a 0.3 restituisce false

console.log(0.1 + 0.2)
// output - 0.30000000000000004
console.log(0.3 === 0.30000000000000004)
// false

Per confrontare questo con il nostro sistema in base 10 che. usiamo nella nostra vita quotidiana I fattori primi di 10 sono 2 e 5. Quindi 1/2, 1/4, 1/5, 1/8 e 1/10 possono essere tutti espressi in modo pulito perché tutti i denominatori usano numeri primi fattori di 10. ciò significa che conosciamo alcuni valori per loro al contrario di 1/3, 1/6, 1/7 e 1/9 sono tutti decimali ripetuti perché i loro denominatori usano un fattore primo di 3 o 7 che non sono fattori primi di 10.

Ora in caso di fuori frazione. sarà convertito in binario (o base-2), quindi l'unico fattore primo è 2, quindi puoi esprimere in modo pulito solo frazioni il cui denominatore ha solo 2 come fattore primo. In binario, 1/2, 1/4, 1/8 sarebbero tutti espressi in modo pulito come decimali, mentre 1/5 o 1/10 sarebbero decimali ripetuti. Quindi 0,1 e 0,2 (1/10 e 1/5) non sarebbero rappresentati in modo pulito, il che risulterà in alcuni avanzi che vediamo nel nostro calcolo a causa della loro rappresentazione.

Riferimenti :

  • La guida in virgola mobile: ciò che ogni programmatore dovrebbe sapere sull'aritmetica in virgola mobile o, perché i miei numeri non si sommano? (virgola mobile-gui.de)
  • https://0.30000000000000004.com/