什么是HALF_EVEN四舍五入?

时间:2015-01-25 09:22:42

标签: java rounding

我无法想象我需要在Java中使用RoundingMode.HALF_EVEN的情况。

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

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

5 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:10)

如果您有随机的负数和正数,HALF_UP就可以了,净误差将趋于0.HALF_UP对于人类来说也更容易理解,并且通常用于财务。

但是,如果你知道你有更多的正(或负)数字,你会得到一个偏见。 HALF_EVEN和HALF_ODD尝试通过选择是否根据是否更有可能转到偶数或奇数来向上或向下舍入0.5来纠正此问题。这在统计上更公平,只要你有50/50的偶数和奇数分开,但人类更难理解。

答案 3 :(得分:4)

行为在Javadoc

中有详细描述
  

舍入模式以绕过最近邻居" 除非两者兼而有之   邻居是等距的,在这种情况下,是向着均匀的   邻居

所以给出数字4.5,当你打电话时,数字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.另外,请记住,关于如何舍入的决定是基于最终结果将是什么(而不是在小十进制的小数部分,你似乎已经假设了。)

答案 4 :(得分:0)

参考this说:

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   

所以它向最接近的值四舍五入,如果它们都是等距的,那么它将向着一个偶数舍入。