Perché 0,1+0,2 non è uguale a 0,3 nella maggior parte dei linguaggi di programmazione?
Nella maggior parte dei computer è vero se si usa == come confronto
per capire perché è necessario capire come i numeri in virgola mobile sono memorizzati su un computer.
il problema principale sul perché in questo caso particolare è perché 0.1 e 0.3 non sono nella stessa base esponenziale all'interno di un float.
quindi a causa di tale 0.3 ha meno precisione di 0.1 e 0.2, e quando si aggiunge 0.1 e 0.2 c'è un po' di troncamento.
primo.
0.1 su un computer non è davvero 0.1 è davvero 0.100000001490116119384765625
(il suo più vicino il computer può ottenere ma il suo non esattamente 0,1)
0,2 su un computer non è realmente 0,2 è invece 0.20000000298023223876953125
- 0.100000001490116119384765625
- +0.20000000298023223876953125
- -------------------------------
- 0.30000000447034835815429687
- but a computer cannot store this number either so it stores
- 0.2999999821186065673828125
- (and yes because 0.1 and 0.2 are in different bases it does lost a few values)
now 0.3 is also not 0.3 but: 0.300000011920928955078125
e chiaramente 0.300000011920928955078125 non è uguale a 0.2999999821186065673828125
si avvicina molto ma non è uguale.
quindi l'aggiunta di punti fluttuanti a meno di casi specifici (nella maggior parte dei casi potenze di 2 o numeri che possono essere divisi per due dopo meno di 24 volte), non può essere rappresentata esattamente come virgola mobile e darà sempre errori.
e quando fate questo con un computer avete bisogno di sapere qual è il vostro margine di errore
(sui float è circa lo stesso numero diviso per un 10^6) per essere sempre al sicuro ed è relativo al numero che state guardando.
in altre parole se aggiungete 1 + 10^6 l'errore sarà terribilmente grande in effetti così tanto che aggiungendo 1 a 10 ^8 vi darà 10^8 senza alcun cambiamento.