RoundingMode.UNNECESSARY 抛出异常
Posted
技术标签:
【中文标题】RoundingMode.UNNECESSARY 抛出异常【英文标题】:RoundingMode.UNNECESSARY throws exception 【发布时间】:2015-06-15 17:33:24 【问题描述】:我写这篇文章是为了测试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));
【问题讨论】:
请发布(添加到您的问题中)您通过完整堆栈跟踪获得的所有异常。 【参考方案1】:这是设计使然。请参阅 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);
【讨论】:
需要更新到pp.setScale(1, RoundingMode.UNNECESSARY);
所以会抛出异常
如果有必要,为什么会有不必要的舍入模式?
@TheGreatGatsbo,我认为它是为了完整性而添加的。所以舍入代码中的所有路径都被相应的模式覆盖。以上是关于RoundingMode.UNNECESSARY 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章