В чем разница между этими двумя вызовами? (Есть ли?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
В чем разница между этими двумя вызовами? (Есть ли?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
Один важный момент, который упоминается, но не упоминается напрямую, — это разница между "точностью" и "масштабом" и тем, как они используются в этих двух утверждениях. "точность" – это общее количество значащих цифр в числе. "масштаб" – это количество цифр справа от десятичной точки.
Конструктор 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
Есть действительно большая разница, которую вы должны иметь в виду. setScale действительно устанавливает масштаб вашего числа, тогда как round округляет ваше число до указанных цифр, НО он «начинается с самой левой цифры точного результата», как указано в jdk. Итак, что касается вашего образца, результаты такие же, но вместо этого попробуйте 0,0034. Вот моя заметка об этом в моем блоге:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html
round
также возвращает новый экземпляр BigDecimal, потому что, как вы сказали, экземпляры неизменяемы. - person daiscog   schedule 18.11.2016