BigDecimal setScale и круглый - PullRequest
       4

BigDecimal setScale и круглый

128 голосов
/ 02 октября 2010

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

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

Ответы [ 2 ]

194 голосов
/ 20 ноября 2012

Важным моментом, который упоминается, но не рассматривается напрямую, является разница между «точность» и «масштаб» и тем, как они используются в двух операторах. «точность» - общее количество значащих цифр в числе. «шкала» - количество цифр справа от десятичной точки.

Конструктор 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
51 голосов
/ 27 июня 2011

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

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

...