web-dev-qa-db-fra.com

A quoi sert l'arrondi HALF_EVEN?

Je ne peux pas imaginer une situation dans laquelle j'ai besoin d'utiliser RoundingMode.HALF_EVEN en Java.

A quoi sert ce mode d'arrondi? Quand veux-je l'utiliser?

S'il vous plaît, donnez-moi des exemples concrets.

15
Xin

C'est utile lorsque vous effectuez plusieurs opérations d'arrondis et que vous voulez que le résultat cumulatif soit une moyenne vraie, et non asymétrique, comme il le serait avec HALF_UP ou HALF_DOWN.

Plus précisément, il est utile pour une analyse statistique (vous ne voulez pas que les résultats soient pollués par un système de calcul de moyenne non aléatoire) ou pour toute situation dans laquelle vous souhaitez effectuer une moyenne aléatoire.

10
CorayThan

RoundingMode.HALF_EVEN arrondit toujours au nombre suivant, comme tout autre algorithme d'arrondi - avec une seule exception: si le nombre à arrondir est compris entre 2 chiffres (2.5, 42.5, -4.5), il ne sera pas arrondi, arrondis-la au voisin qui est pair. Voici quelques exemples:

  • 3.2 -> 3
  • 3.4 -> 3
  • 3,5 -> 4
  • 4,5 -> 4
  • 5,5 -> 6
  • -7,5 -> -8
21
maja

Si vous avez des nombres positifs et négatifs aléatoires, HALF_UP convient et l'erreur nette tendra à 0. HALF_UP est également plus facile à comprendre pour un humain et est souvent utilisé dans la finance.

Cependant, si vous savez que vous avez plus de nombres positifs (ou négatifs), vous aurez un biais. HALF_EVEN et HALF_ODD tentent de corriger ce problème en choisissant d’arrondir 0,5 supérieur ou inférieur en fonction des chances plus grandes de passer à un nombre pair ou impair. Ceci est statistiquement plus juste, à condition que vous ayez un nombre égal à 50/50 de nombres pairs et impairs, même s'il est plus difficile à comprendre pour un humain. 

8
Peter Lawrey

Le comportement est bien décrit dans la Javadoc :

Mode d'arrondi pour arrondir vers le "plus proche voisin" sauf si les deux les voisins sont équidistants, auquel cas, arrondis au même voisin.

Donc, étant donné le numéro 4.5, qui se trouve en plein milieu de la plage de chiffres comprise entre 4 et 5, lorsque vous appelez:

BigDecimal value1 = new BigDecimal("4.5").setScale(RoundingMode.ROUND_HALF_EVEN);

Le moteur d’exécution doit déterminer quel voisin doit également être arrondi. Autrement dit, doit-il arrondir à 4 ou à 5? Normalement, il arrondirait en fonction de la valeur 4.5 la plus proche, mais dans ce cas, elle est proche de les deux voisins. Au lieu de choisir arbitrairement le résultat final, il choisit le nombre pair. C'est le comportement de ROUND_HALF_EVEN. Si vous le souhaitez, vous pouvez spécifier ROUND_HALF_UP et le résultat final aurait été 5, et non 4. De plus, n'oubliez pas que la détermination de la manière d'arrondir est basée sur le résultat final (et non sur la partie décimale de la grande décimale, comme vous semblez l’avoir supposé).

4
Ronald Duck

Se référant ceci dit:

Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. Behaves as for RoundingMode.HALF_UP if the digit to the left of the discarded fraction is odd; behaves as for RoundingMode.HALF_DOWN if it's even. Note that this is the rounding mode that statistically minimizes cumulative error when applied repeatedly over a sequence of calculations. It is sometimes known as "Banker's rounding," and is chiefly used in the USA. This rounding mode is analogous to the rounding policy used for float and double arithmetic in Java.

Example:

Input ->    rounded  
5.5   ->    6  
2.5   ->    2  
1.6   ->    2  
1.1   ->    1  
1.0   ->    1  
-1.0  ->    -1  
-1.1  ->    -1  
-1.6  ->    -2  
-2.5  ->    -2  
-5.5  ->    -6   

Donc, il arrondit à la valeur la plus proche et si les deux sont équidistants, il arrondit à un nombre pair.

0
SMA