Scale () метода Divide в BigDecimal - PullRequest
6 голосов
/ 22 июля 2010
new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale()

Возвращает 10.Но в соответствии с API, метод divide:

Возвращает BigDecimal, значение которого (this / divisor), и чей предпочтительный масштаб (this.scale () - divisor.scale ());

Таким образом, в этом случае масштаб 37146555.53880000's равен 8, а масштаб 1000000 равен 0.Таким образом, результат должен иметь шкалу 8, а не 10.

Что мне здесь не хватает?

Спасибо

Ответы [ 3 ]

4 голосов
/ 22 июля 2010

Фактический результат - 37.1465555388, масштаб которого должен быть 10, чтобы быть точным.

Что говорит JavaDoc, так это то, что предпочтительный масштаб - это разница, означающая, что если результат на самом деле не должен быть равен 10, то попытался бы сделать это 8. Например, если бы вы поделили на 2, чья шкала также равна 0, результат был бы 18573277.76940000 (шкала 8).

РЕДАКТИРОВАТЬ: маленькое добавление - вы можетефорсировать деление до определенного масштаба, используя перегруженные методы деления:

  • divide(BigDecimal, RoundingMode), что даст BigDecimal со шкалой this и значением, округленным с использованием указанного метода округленияесли результат на самом деле потребует большего количества десятичных знаков, чтобы быть точным.

  • divide(BigDecimal, scale, RoundingMode), который даст BigDecimal с указанным масштабом и значением, округленным указанным методом, если необходимо.

Это может быть полезно, если ваше деление на число, которое вы знаете, может вызвать повторяющиеся десятичные числа, например 3 (1/3 = 0,333333 ...), поскольку, если это произойдет, простое деление wiскину исключение.Ограничение до максимального количества десятичных знаков поможет вам избежать исключения, но сделает ваши вычисления менее точными.

1 голос
/ 22 июля 2010

Эти шкалы используются теми методами, которые возвращают точные арифметические результаты; за исключением того, что для точного деления может потребоваться больший масштаб , поскольку точный результат может содержать больше цифр.Например, 1/32 - это 0,03125.

0 голосов
/ 22 июля 2010

В нем говорится «предпочтительный масштаб», а не «определенно будет масштаб».

Чтобы быть абсолютно уверенным, я бы использовал BigDecimal.divide(BigDecimal, int, int).

...