2013-03-12 76 views
5

下面的代码,它使用RoundingMode.HALF_EVEN舍入模式的BigDecimal在Java中

BigDecimal value1 = new BigDecimal("4.5"); 
value1=value1.setScale(0, RoundingMode.HALF_EVEN); 

BigDecimal value2 = new BigDecimal("6.5"); 
value2=value2.setScale(0, RoundingMode.HALF_EVEN); 

System.out.println(value1+"\n"+value2); 

显示器分别46。在我看来,它应该分别显示57,因为丢弃的小数部分(在本例中为5)左边的数字是奇数。在这种情况下,它执行RoundingMode.HALF_UP

并要在RoundingMode.HALF_UP情况下,RoundingMode.UP是当丢弃小数部分是> = 0.5(其为真)进行,否则RoundingMode.DOWN被执行。

+0

'4'和'6'是'ROUND_HALF_EVEN'中的'EVEN'。 '.5'是'HALF'部分。 – 2013-03-12 02:36:38

+2

对于后代,我不得不阅读几次以获得它。一个对我来说很有意义的例子是,如果你四舍五入,那么你距离6和7的距离相等。因为6是平的,所以你选择了那个。 – 2014-07-16 20:07:09

回答

13

行为在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.另外,请记住,关于如何舍入的决定取决于最终结果是什么(而不是小数部分就像你似乎已经假设的那样)。

+0

我没有得到这个引用文本。 – Tiny 2013-03-12 02:41:16

+0

@Tiny,这意味着如果你正在四舍五入的数字在半平模式下落在奇数和偶数之间的范围的中心,那么偶数将是舍入操作的结果。 – Perception 2013-03-12 02:47:40

+0

如果可以,请用一个简单的例子来解释。我发现这个基本的东西很难理解,并且我个人不能咨询某人的帮助。 – Tiny 2013-03-12 03:06:55