在尝试将数字的小数点后一位四舍五入至千分之一时遇到了问题。
示例:
powershell_Core_6.1.0_x64 6.1.0
powershell_Core_6.1.0_x64_Path C:\Program Files\PowerShell\6
powershell_Core_x64 6.1.0
输出为BigDecimal num1 = BigDecimal.valueOf(0.38871551);
MathContext mc = new MathContext(5);
System.out.println(num1.round(mc));
,符合预期。到目前为止一切都很好。让我们再举一个例子:
0.38872
输出为BigDecimal num1 = BigDecimal.valueOf(1.1680418);
MathContext mc = new MathContext(5);
System.out.println(num1.round(mc));
。这就是问题所在。我想要的输出是1.1680
,但是四舍五入似乎使1.16804
吃光了,而不是照原样保留。
我尝试了不同的舍入模式,但这是我得到的:
4
给出RoundMode.UP
1.1681
或RoundingMode.HALF_UP
赋予RoundingMode.HALF_DOWN
等等。如何获得所需的输出:
1.1680
应该四舍五入到0.38871551
0.38872
应该四舍五入到1.1680418
1.16804
应该四舍五入到0.55052984
我什至尝试舍入到小数点后第六位而不是第五位,但是我找不到合适的组合,从而获得所需的输出,如上所示。
答案 0 :(得分:3)
您可以使用BigDecimal的setScale函数进行尝试
num1 = num1.setScale(5, BigDecimal.ROUND_HALF_UP);
答案 1 :(得分:2)
MathContext(int)
将数字四舍五入到该位数,并考虑了整个数字,而不只是逗号后面的数字。
假设您使用以下数字:
BigDecimal ten = BigDecimal.valueOf(10.55052984);
MathContext five = new MathContext(5);
MathContext two = new MathContext(2);
System.out.println(ten.round(five));
System.out.println(ten.round(two));
无论位置如何,它都会产生一个四舍五入到第5位或第2位的数字:
10.551
11
这应该有效:
BigDecimal num1 = BigDecimal.valueOf(0.38871551);
System.out.println(num1.setScale(5, RoundingMode.HALF_UP));
num1 = BigDecimal.valueOf(1.1680418);
System.out.println(num1.setScale(5, RoundingMode.HALF_UP));
num1 = BigDecimal.valueOf(0.55052984);
System.out.println(num1.setScale(5, RoundingMode.HALF_UP));
0.38872
1.16804
0.55053
答案 2 :(得分:1)
您可以尝试这种方式
DecimalFormat df = new DecimalFormat("#.00000");
System.out.print(df.format(1.1680418)); //1.16804