RoundingMode.UNNECESSARY会抛出异常。

4

我写这个测试是为了测试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));

    }
}

2
请在您的问题中发布(添加)所有异常及其完整堆栈跟踪。 - PM 77-1
1个回答

11

这是有意而为之的。请参见Java文档:

指定舍入模式以断言所请求的操作具有精确结果,因此无需舍入。如果在产生非精确结果的操作上指定了此舍入模式,则会抛出{@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);

需要更新为 pp.setScale(1, RoundingMode.UNNECESSARY);,这样它就会抛出异常。 - user7294900
为什么在舍入时会有一个不必要的模式,如果它是必要的呢? - user4957392
@TheGreatGatsbo,我认为这是为了完整性而添加的。因此,舍入代码中的所有路径都由相应的模式覆盖。 - Sergey Grinev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接