2013-08-07 3 views
2

Почему существует метод BigDecimal.setScale(), который устанавливает десятичные значения в какое-то значение и не имеет метода MathContext.setScale(), но только конструктор MathContext(precision) или наоборот, почему нет метода BigDecimal.setPrecision()?Почему нет метода BigDecimal.setPrecision()?

EDIT: Нет способа MathContext.setPrecision(), только конструктор MathContext(precision). Отредактирован текст. Простите за это.

EDIT2: Я просто хотел понять, почему существуют два способа приближения к настройке масштаба/точности. Кажется, нет никакой реальной причины иметь двух из них относительно ответа Ричарда Ситце.

Смотрите этот пример, который делает ясно, что вы можете действительно странные результаты playign с точностью и масштабом:

MathContext mc = new MathContext(2); 
BigDecimal test = new BigDecimal("100.234", mc); 
System.out.println("Scale: " + test.scale() + ", value: " + test); 
test.setScale(6); 
System.out.println("Scale: " + test.scale() + ", value: " + test); 
test = test.add(new BigDecimal("100")); 
System.out.println("Scale: " + test.scale() + ", value: " + test); 

Результаты в:

Scale: -1, value: 1.0E+2 
Scale: -1, value: 1.0E+2 
Scale: 0, value: 200 

Результаты являются правильными в отношении параметров, но когда я установил шкала до 6 Я ожидаю предупреждение/подсказку/исключение, в котором говорится, что прецизионные настройки не позволяют использовать шкалу 6.

+4

Вам нужно спросить, кто пишет 'BigDecimal'. – arshajii

+1

Какую конкретную проблему вы пытаетесь решить, задав этот вопрос? –

+0

@SteveP. Точность может быть задана как аргумент конструктора MathContext. MathContext неизменен, поэтому никаких методов setXXX вообще не существует. –

ответ

2

Полномочия-которые-быть объявлены, что общая точность (общее кол-во цифр) можно регулировать лишь случайно путем изменения масштаба (# цифр справа от десятичной точки).

Это подходит, так как любое изменение точности требует изменения масштаба. В лучшем случае setPrecision является избыточным; , имеющий только setScale, привел к более чистым API.

Теперь рассмотрим изменение точности и то, как результат может быть округлен. Пройдя этот анализ, вы рассмотрите «сколько цифр должно оставаться после округления». То, что является шкала. Таким образом, любое такое рассмотрение приводит к вопросу о том, как изменить масштаб .

setScale с его вариантами, чтобы указать округление, является естественным. Меньше для гипотетического setPrecision, который просит комментарии коментариев, чтобы заполнить пробел (ИМХО).

3

Нет способа MathContext.setPrecision(), только нестатический getPrecision(). Конструктор для MathContext - это то, что используется для установки точности.

Если вы обратитесь к документации BigDecimal, мы имеем:

Класс BigDecimal дает своему пользователю полный контроль над округлением поведение. Если не указан режим округления и точный результат не может быть представлен , генерируется исключение; в противном случае расчет может быть выполнен в выбранном режиме точности и округления путем подачи к операции соответствующего объекта MathContext .

По существу, нет причин для воссоздания колеса. MathContext уже делает это, по дизайну.

Смежные вопросы