Domanda

float totalAmount = 0;
.
.
.//totalAmount assigned value 1.05 correctly
.
totalAmount  += float.Parse(dataRow["Amt"].ToString()); //where dataRow["Amt"] has value 4.93

La risposta che ottengo per TotalAmount è 5,97,999954 millions invece di 5.98

Perché sta succedendo?

È stato utile?

Soluzione

Lei afferma totalAmount è 1,05, prima che l'accumulo. Questo darebbe risultati attesi:

1.05
4.93 +
------
5.98

Hai trovato 5,97,999954 millions, che è sostanzialmente la risposta come meglio rappresentato da IEEE in virgola mobile, che è un formato binario che non può esattamente esprimere ogni numero decimale. Per esempio, piuttosto comune 0,1 10 ha un infinito binario virgola mobile rappresentazione .0001100110011... 2 .

E un link di Wikipedia, per buona misura: http://en.wikipedia.org/ wiki / floating point # Accuracy_problems ;)

Altri suggerimenti

Ciò è dovuto a rappresentare base 10 numeri in un base-2 sistema

calcoli in virgola mobile su computer fa sempre questo. Se si conosce il livello di precisione è necessario si dovrebbe usare la rappresentazione decimale appropriata.

jdmichal è corretto, ma io aggiungo che, se si vuole realmente questo per aggiungere correttamente, è possibile utilizzare il tipo di decimale (compreso letterali decimali).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top