大十进制转换问题

时间:2015-04-09 14:45:02

标签: java scale bigdecimal rounding

您正在使用HALF_EVEN舍入(银行四舍五入)似乎Java中的四舍五入没有按预期工作。以下打印件应提供与250335.62相同的输出,但第二次打印输出为250335.63。 请建议

System.out.println(new BigDecimal("250335.625").setScale(2, RoundingMode.HALF_EVEN));
System.out.println(new BigDecimal("250335.6250294325406169060513303508358832").setScale(2, RoundingMode.HALF_EVEN));

2 个答案:

答案 0 :(得分:6)

来自Documentation

  

舍入模式向“最近邻居”舍入,除非两个邻居都是等距的,在这种情况下,向着偶邻居舍入。   如果丢弃的分数左边的数字是奇数,则表现为RoundingMode.HALF_UP;如果它是偶数

,则表现为RoundingMode.HALF_DOWN

以下情况:

250335.625

它与.62.63等距,因此它使用的是2的左邻居even因此HALF_DOWN

以下情况:

250335.6250294325406169060513303508358832

它离.63更近,所以它去了那里。

如果您尝试使用250335.615,您会看到它与.61.62等距,但左邻居1odd所以它会{ {1}}。

给予HALF_UP

答案 1 :(得分:4)

RoundingMode.HALF_EVEN围绕最近邻居 - 当您0.62502时,该数字更接近0.63而非0.62。只有当差异相同时,它才会舍入到偶数 - 小数部分以5结尾。