BigDecimal setМасштаб и округление

В чем разница между этими двумя вызовами? (Есть ли?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);

person user    schedule 01.10.2010    source источник
comment
помимо принятых ответов ниже - setScale() создает новый объект BigDecimal - учитывая его неизменяемый класс   -  person prash    schedule 17.11.2015
comment
@prash метод round также возвращает новый экземпляр BigDecimal, потому что, как вы сказали, экземпляры неизменяемы.   -  person daiscog    schedule 18.11.2016


Ответы (2)


Один важный момент, который упоминается, но не упоминается напрямую, — это разница между "точностью" и "масштабом" и тем, как они используются в этих двух утверждениях. "точность" – это общее количество значащих цифр в числе. "масштаб" – это количество цифр справа от десятичной точки.

Конструктор MathContext принимает в качестве аргументов только точность и RoundingMode, поэтому масштаб никогда не указывается в первом операторе.

setScale() очевидно принимает масштаб в качестве аргумента, а также RoundingMode, однако во втором операторе точность никогда не указывается.

Если вы переместите запятую на одно место вправо, разница станет очевидной:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456
person dale peters    schedule 19.11.2012
comment
Re: точность - это общее количество цифр в числе. Нет. Точность — это количество значащих цифр. Точность 0,000042M равна 2. - person David J.; 04.12.2013
comment
См.: точность: подсчет цифр начинается с самой левой ненулевой цифры точного результата. docs.oracle.com/javase/7/docs/ API/java/math/BigDecimal.html - person Eddy; 06.09.2016
comment
если Precision - это количество значащих цифр, то почему точность 0,0000009 равна 2? должно быть 1 - person Sanchi Girotra; 24.10.2016
comment
Как устанавливается значение вашего BigDecimal? Как вы выводите значение (использование String.format() может скрыть значащие цифры)? - person dale peters; 25.10.2016
comment
@SanchiGirotra Точность — это количество цифр в немасштабированном значении. Точность 2 с немасштабированным значением 90 и масштабом 8 дает 0,0000009. Как и точность 1, немасштабированное значение 9 и масштаб 7. - person daiscog; 18.11.2016

Есть действительно большая разница, которую вы должны иметь в виду. setScale действительно устанавливает масштаб вашего числа, тогда как round округляет ваше число до указанных цифр, НО он «начинается с самой левой цифры точного результата», как указано в jdk. Итак, что касается вашего образца, результаты такие же, но вместо этого попробуйте 0,0034. Вот моя заметка об этом в моем блоге:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

person user817756    schedule 27.06.2011
comment
Результаты выборки разные: //1 — 3,535, а //2 — 3,5346. - person fall; 11.02.2021