Question

ticketPriceInPence = 7360
percentageToRefund = 100

(int)(Math.Round((ticketPriceInPence * 0.01) * (percentageToRefund * 0.01), 2, MidpointRounding.AwayFromZero) * 100)

Cela donne: 73.59

(int)(Math.Round((ticketPriceInPence * 0.01) * (percentageToRefund * 0.01) * 100, 2, MidpointRounding.AwayFromZero))

Cela se traduit par: 73.60

Toute idée de pourquoi il en résulte 2 résultats différents

Était-ce utile?

La solution

Il s’agit du ancien cas de nombres en virgule flottante ne pouvant pas représente exactement les décimales .

Vous semblez avoir affaire à de l'argent ici et vous devriez alors envisager d'utiliser décimal .

decimal ticketPriceInPence = 7360;
decimal percentageToRefund = 100;
var result1 = (int)(Math.Round((ticketPriceInPence * 0.01m) * (percentageToRefund * 0.01m), 2, MidpointRounding.AwayFromZero) * 100);
var result2 = (int)(Math.Round((ticketPriceInPence * 0.01m) * (percentageToRefund * 0.01m) * 100, 2, MidpointRounding.AwayFromZero));

Autres conseils

La réponse simple est qu’elle est due à une erreur d’arrondi dans les équations utilisant des nombres à virgule flottante. En effet, en général, il n’existe pas de représentation binaire exacte d’un nombre à virgule flottante, vous n’avez donc qu’une approximation.

Je remarque que vous avez:

(percentageToRefund * 0.01)

dans la première équation, et:

(percentageToRefund * 0.01) * 100

dans la seconde.

Cette dernière expression entraîne une erreur d’arrondi lorsque vous divisez d’abord par 100, puis par 100. L'entrée ne sera pas égale à la sortie, la différence dépend de l'architecture de la machine, du système d'exploitation, de la langue et du compilateur.

Si vous traitez avec de l'argent, vous devez utiliser le type décimal (en supposant que C #)

Parce qu'un float n'est pas un nombre exact. Je recommande de lire http://en.wikipedia.org/wiki/Floating_point . Vous verrez pourquoi le résultat est différent.

Longue histoire courte. Cela est dû à des erreurs de précision lors de la représentation de valeurs flottantes sous forme de données binaires. Cela signifie en gros que vous ne pouvez pas représenter tous les flottants possibles avec 32/64 bits, donc 2.1 correspond en réalité à 2.1000000000000001, etc. C’est une des raisons pour lesquelles vous ne devriez jamais faire quelque chose comme 2.145 == "autre valeur qui devrait être 2.145". / p>

Je suggère de lire l'article sur wikipedia pour plus d'informations: Lien Wiki

Cela est dû à la précision finie des nombres en virgule flottante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top