舍入模式.不必要的引发异常



我写这篇文章是为了测试BigDecimal的实际效果,但发现RoundingMode.UNNECESSARY抛出了一个异常。谁能解释为什么?

public class TestRounding2 {
    public static void main(String args[]) {
        Locale swedish = new Locale("sv", "SE");
        BigDecimal pp; //declare variable pp=pounds pence
        NumberFormat swedishFormat = NumberFormat.getCurrencyInstance(swedish);
        Scanner scan = new Scanner(System.in);
        System.out.println("ENTER POUNDS AND PENCE TO AT LEAST FIVE DECIMAL PLACES :");
        pp = scan.nextBigDecimal();
        BigDecimal pp1 = pp.setScale(2, RoundingMode.HALF_EVEN);
        System.out.println("HALF_EVEN: £ " + pp1.toString());
        System.out.println(swedishFormat.format(pp1));
        BigDecimal pp2 = pp.setScale(2, RoundingMode.FLOOR);
        System.out.println("FLOOR: £ " + pp2.toString());
        System.out.println(swedishFormat.format(pp2));
        BigDecimal pp3 = pp.setScale(2, RoundingMode.CEILING);
        System.out.println("CEILING £: " + pp3.toString());
        System.out.println(swedishFormat.format(pp3));
        BigDecimal pp4 = pp.setScale(2, RoundingMode.HALF_DOWN);
        System.out.println("HALF DOWN £: " + pp4.toString());
        System.out.println(swedishFormat.format(pp4));
        BigDecimal pp5 = pp.setScale(2, RoundingMode.HALF_UP);
        System.out.println("HALF UP: £ " + pp5.toString());
        System.out.println(swedishFormat.format(pp5));
        BigDecimal pp6 = pp.setScale(2, RoundingMode.UP);
        System.out.println("UP: £ " + pp6.toString());
        System.out.println(swedishFormat.format(pp6));
        BigDecimal pp7 = pp.setScale(2, RoundingMode.DOWN);
        System.out.println("DOWN: £ " + pp7.toString());
        System.out.println(swedishFormat.format(pp7));
        BigDecimal pp8 = pp.setScale(2, RoundingMode.UP);
        System.out.println("UP:  " + pp8.toString());
        System.out.println(swedishFormat.format(pp8));
    }
}

这是设计使然。参见javadoc:

舍入模式,用于断言请求的操作具有精确的 结果,因此不需要四舍五入。 如果此舍入模式为 在产生不精确结果的操作上指定,即 {@code ArithmeticException} 被抛出。

此模式专门用于在有要舍入的内容时引发异常。

例子。下一个代码不会引发异常。

    BigDecimal pp = new BigDecimal(7);
    pp.setScale(2, RoundingMode.UNNECESSARY);
    System.out.println(pp);

7更改为小数会导致异常,因为现在需要对其进行四舍五入:

    BigDecimal pp = new BigDecimal(7.1);
    pp.setScale(2, RoundingMode.UNNECESSARY);
    // java.lang.ArithmeticException: Rounding necessary
    System.out.println(pp);

最新更新