2013-12-12 104 views
3

我需要使用的BigDecimal roundingmode.xxx和setScale(2)这些结果:的BigDecimal舍入模式问题

(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设置了三个成功的结果。

+1

http://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode。html#HALF_DOWN – cHao

回答

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

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 
3

你可以使用ROUND_HALF_DOWN

入模式走向 “近邻” 轮,除非双方 的距离相等,在这种情况下,下降。如果废弃部分大于0.5,则表现为 ROUND_UP;否则,表现为 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); 
+0

我们有几乎相同的答案xD – nachokk

+0

我不知道发生了什么,但我没有得到它与round_half_down。我的值为:2.89500004313886165618896484375并且在使用setScale(....)后,结果为2.90 – Al2x

+0

@Al2x(1)从上面的文档链接可以看出,大于0.5的分数将被舍入。 (2)请在你的问题中包含正确的例子。 – devnull