四舍五入到最接近的千分之一
Rounding to the nearest hundered-thousandths
我在尝试将数字中的小数位四舍五入到最接近的千位时遇到问题。
示例:
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.55053
我什至尝试四舍五入到小数点后第 6 位而不是小数点后第 5 位,但我无法找到能给我所需输出的正确组合,如上所示。
你可以这样试试
DecimalFormat df = new DecimalFormat("#.00000");
System.out.print(df.format(1.1680418)); //1.16804
你可以试试BigDecimal的setScale函数
num1 = num1.setScale(5, BigDecimal.ROUND_HALF_UP);
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
我在尝试将数字中的小数位四舍五入到最接近的千位时遇到问题。
示例:
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.55053
我什至尝试四舍五入到小数点后第 6 位而不是小数点后第 5 位,但我无法找到能给我所需输出的正确组合,如上所示。
你可以这样试试
DecimalFormat df = new DecimalFormat("#.00000");
System.out.print(df.format(1.1680418)); //1.16804
你可以试试BigDecimal的setScale函数
num1 = num1.setScale(5, BigDecimal.ROUND_HALF_UP);
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