В чем разница между этими двумя вызовами? (Есть ли?)
// 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 действительно устанавливает масштаб вашего номера, тогда как круг округляет ваш номер до указанных цифр, НО "начинается с самой левой цифры точного результата", как указано в jdk. Так что в отношении вашего образца результаты одинаковы, но вместо этого попробуйте 0,0034. Вот моя заметка об этом в моем блоге:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html