Для чего нужна половина округления? [закрытый]

Я не могу себе представить ситуацию, которую мне нужно использовать RoundingMode.HALF_EVEN в Java.

для чего этот режим округления? Когда я хочу его использовать?

пожалуйста, дайте мне некоторые реальные примеры.

5 ответов


Это полезно, когда вы выполняете несколько операций округления и хотите, чтобы кумулятивный результат был истинным средним, а не перекошенным вверх или вниз, как это было бы с HALF_UP или HALF_DOWN.

в частности, это полезно для статистического анализа (вы не хотите, чтобы результаты загрязнялись неслучайной системой усреднения) или любой ситуации, когда вы хотите случайное усреднение.


RoundingMode.HALF_EVEN всегда округляется до следующего числа, как и любой другой округление-algorithmn-только с одним исполнением: если число к раунду точно между 2 числами (2.5, 42.5, -4.5), он не будет округлять его, а вместо этого округляет его до соседа, который является четным. Вот несколько примеров:

  • 3.2 -> 3
  • 3.4 -> 3
  • 3.5 -> 4
  • 4.5 -> 4
  • 5.5 -> 6
  • -7.5 - > -8

Если у вас есть случайные отрицательные и положительные числа HALF_UP в порядке, и чистая ошибка будет иметь тенденцию к 0. HALF_UP также легче понять человеку и часто используется в финансах.

однако, если вы знаете, что у вас больше положительных (или отрицательных) чисел, вы получите смещение. HALF_EVEN и HALF_ODD пытаются исправить это, выбрав округление 0.5 вверх или вниз на основе того, будет ли он более вероятным для четного или нечетного числа. Это статистически справедливее, при условии, что у вас есть 50/50 деление четных и нечетных чисел, однако сложнее для человека понять.


поведение хорошо описано в Javadoc:

режим округления, чтобы округлить в сторону "ближайшего соседа"если оба соседи являются равноотстоящими,, вокруг К даже сосед!--10-->.

Итак, учитывая число 4.5, которое попадает прямо в середину диапазона чисел между 4 и 5, Когда вы звоните:

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

среда выполнения должна выяснить, какой сосед тоже округлить, ака, округлить до 4 или до 5? Обычно он округляется, исходя из того, какое значение 4.5 ближе, но в этом случае его близко к и соседи. Вместо того, чтобы произвольно выбирать конечный результат, он выбирает четное число. Это поведение ROUND_HALF_EVEN. Если вы хотите, вы можете указать ROUND_HALF_UP и конечный результат был бы 5, а не 4. Кроме того, имейте в виду, что определение о том, как округлить, основано на том, каким будет конечный результат (и не на десятичной части большого десятичного знака,как вы, кажется, предположили).


ссыль этой говорит:

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   

таким образом, он округляется до ближайшего значения, и если оба равноудалены, то он округляется до четного числа.