3 votes

Round 1,7346 to 1,74

J'utilise Math.Round(1.7346, 2, AwayFromZero) ce qui devrait me donner 1,74 - mais il me donne en fait 1,73.

Je sais que c'est à cause de ça :

"En raison de la perte de précision que peut entraîner la représentation de décimales sous forme de nombres à virgule flottante ou en effectuant des opérations arithmétiques sur des valeurs à virgule flottante, dans certains cas, la fonction Round(Double, Int32, MidpointRounding) peut ne pas sembler arrondir les valeurs de points comme spécifié par le paramètre mode. Ceci est illustré dans l'exemple exemple suivant, où 2,135 est arrondi à 2,13 au lieu de 2,14. Cela se produit car, en interne, la méthode multiplie la valeur par 10 * chiffres, et l'opération de multiplication dans ce cas souffre d'une erreur de calcul. perte de précision".

Mais quelle méthode .NET dois-je utiliser pour effectuer un arrondi correct ?

5voto

larsmans Points 167484

1.7346 devrait être arrondi à 1.73, même avec AwayFromZero car cela ne modifie le comportement d'arrondi que "lorsqu'un nombre est à mi-chemin entre deux autres" (par exemple, s'il avait été 1,735).

Le comportement que vous souhaitez peut être obtenu avec

Math.Round(Math.Round(1.7346, 3, AwayFromZero), 2, AwayFromZero)

(mais ne considérez pas cela comme autre chose qu'un hack).

2voto

Ondrej Tucny Points 13127

Votre hypothèse est en partie fausse. 1.7346 est arrondi à 1.73 à cause de la sémantique de l'expression "1.7346". AwayFromZero c'est-à-dire :

  • < 0.5 → 0.0
  • 0.5 → 1.0
  • > 0.5 → 1.0
  • < -0.5 → -1.0
  • -0.5 → -1.0
  • > -0.5 → 0.0

Pour éviter les problèmes causés par l'arithmétique à virgule flottante, utilisez la fonction decimal type de données qui est précis en termes de système numérique décimal.

Pour développer un arrondi " personnalisé " au nombre supérieur ou inférieur le plus proche, vous pouvez utiliser Math.Ceiling o Math.Floor respectivement. Ils sont tous deux disponibles pour double y decimal types.

1voto

stackr Points 2086
Math.ceil()

Rounds up :) J'espère que cela vous aidera

Et comme indiqué 1.7345 doit être arrondi vers le bas car 1.7351 sera arrondi vers le haut avec Math.Round(). Donc, vous devez savoir ce que vous voulez

Math.round() //Rounds
Math.floor() //Rounds down
Math.ceil() //Rounds up

0voto

yas4891 Points 2790

Je pense que la raison pour laquelle Math.Round() Les travaux de ce type ont été abordés par d'autres.

Une autre façon d'obtenir le résultat souhaité est d'ajouter 0,005 à la valeur :

Math.Round(1.7346 + 0.005, 2, AwayFromZero)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X