什么是HALF_EVEN四舍五入?

我无法想象我需要在Java中使用RoundingMode.HALF_EVEN

这种舍入模式是什么? 我什么时候想用它?

请给我一些真实世界的例子。

当您执行多个舍入操作并希望累积结果为真正的平均值,而不是像HALF_UP或HALF_DOWN一样向上或向下倾斜时,它非常有用。

具体而言,它可用于统计分析(您不希望非随机平均系统污染结果)或任何需要随机平均的情况。

RoundingMode.HALF_EVEN总是RoundingMode.HALF_EVEN到下一个数字,就像任何其他舍入算法一样 – 只有一个execption:如果数字到圆形是两个数字(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中很好地描述了这种行为:

舍入模式向“最近邻居”舍入, 除非两个邻居等距,在这种情况下,向着偶邻居舍入

所以给出数字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 

所以它向最接近的值四舍五入,如果两者都是等距的,那么它将朝向偶数。