BigDecimal舍入模式问题

时间:2013-12-12 14:22:47

标签: java bigdecimal

我需要使用BigDecimal roundingmode.xxx和setScale(2)获得这些结果:

(5.789).setScale(2, RoundingMode.xxx) = 5.79

(2.894).setScale(2, RoundingMode.xxx) = 2.89

(2.895).setScale(2, RoundingMode.xxx) = 2.89

对于三个给定值,RoundingMode.xxx 必须相同

我尝试了所有组合,但没有成功,Microsoft Excel将这三个结果设置为成功。

3 个答案:

答案 0 :(得分:4)

您可以使用ROUND_HALF_DOWN

  

舍入模式向“最近邻居”舍入,除非两者都是   邻居是等距的,在这种情况下向下舍入。表现为   如果丢弃的分数> 1,则ROUND_UP 0.5;否则,表现得像   ROUND_DOWN。

您的意见:

static void roundTo(BigDecimal input)
{
    BigDecimal output = input.setScale(2, BigDecimal.ROUND_HALF_DOWN);
    System.out.println(input + " => " + output);
}

roundTo(new BigDecimal("5.789"));
roundTo(new BigDecimal("2.894"));
roundTo(new BigDecimal("2.895"));

这会产生:

5.789 => 5.79
2.894 => 2.89
2.895 => 2.89

编辑:根据您的意见,以下内容可能对您有用:

BigDecimal output = input.setScale(3, BigDecimal.ROUND_HALF_DOWN).setScale(2, BigDecimal.ROUND_HALF_DOWN);

答案 1 :(得分:1)

您正在寻找RoundingMode.HALF_DOWN

  

舍入模式向“最近邻居”舍入,除非两者都是   邻居是等距的,在这种情况下向下舍入。表现为   RoundingMode.UP如果丢弃的分数是> 0.5;否则,表现   至于RoundingMode.DOWN。

示例:

public static void main(String args []){

  System.out.println(new BigDecimal("5.789").setScale(2, RoundingMode.HALF_DOWN));
  System.out.println(new BigDecimal("2.894").setScale(2, RoundingMode.HALF_DOWN));
  System.out.println(new BigDecimal("2.895").setScale(2, RoundingMode.HALF_DOWN));

}

输出

5.79
2.89
2.89

答案 2 :(得分:0)

问题是,当我将两个BigDecimal数字相乘时,我得到了一个很大的结果。之后我使用setScale(2, HalfDown)但没有得到理想的结果。

结果错误

"2.89500004313886165618896484375".setScale(2, BigDecimal.ROUND_HALF_DOWN);

我需要2.89而错误的结果是2.90

使用.round(new MathContext(2))我明白了:

 "2.89500004313886165618896484375".round(new MathContext(2));

正确的结果是2.89