Non esiste un numero come 8.7 o 1.3 in virgola mobile. C'è un numero 10 e un numero -6.5 e un numero 0.96044921875 ... ma non 8.7 o 1.3.
Nella migliore delle ipotesi, il computer può arrotondare 8,7 al numero a virgola mobile più vicino e arrotondare a 1,3 al numero a virgola mobile più vicino. Il computer aggiunge questi numeri arrotondati l'uno all'altro, quindi arrotonda il risultato.
Non utilizzare i numeri in virgola mobile per denaro.
#include <stdio.h>
int main(int argc, char *argv[])
{
float a = 8.7, b = 1.3;
printf("Looks like: %.1f + %.1f = %.1f\n", a, b, a+b);
printf("The truth: %.20f + %.20f = %.20f\n", a, b, a+b);
return 0;
}
Su un GCC x86/computer Linux, ottengo il risultato:
Looks like: 8.7 + 1.3 = 10.0
The truth: 8.69999980926513671875 + 1.29999995231628417969 = 9.99999976158142089844
Su un computer PPC GCC/OS X, ottengo il risultato:
Looks like: 8.7 + 1.3 = 10.0
The truth: 8.69999980926513671875 + 1.29999995231628417969 = 10.00000000000000000000
Avviso come 8.7 e 1.3 sono entrambi arrotondati in questo caso particolare. Se hai scelto i numeri che vengono arrotondati, potresti vedere un numero maggiore di 10 sul lato destro.
Vedi Ciò che ogni computer Scientist dovrebbe sapere aritmetica alla virgola mobile, da David Goldberg (link).
fonte
2011-09-10 05:17:43
Non utilizzare ** binary ** floating-point per denaro. Il virgola mobile decimale è stato standardizzato precisamente per le applicazioni finanziarie. –
@Pascal Cuoq: Non si dovrebbe usare un decimale a punti fissi per soldi? In alcuni casi tale aritmetica è legalmente obbligatoria ... –