2015-06-15 2 views
3

Я написал об этом для проверки BigDecimal в действии, но обнаружили, что RoundingMode.UNNECESSARY исключены. Может ли кто-нибудь объяснить, почему?RoundingMode.UNNECESSARY throws exception

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

Пожалуйста, пост (добавить в ваш вопрос) все исключения, которые вы получаете с полной трассировки стека. –

ответ

10

Это по дизайну. См. 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);