Может кто-нибудь объяснить, почему у этих двух разные результаты?
BigDecimal bd1 = new BigDecimal(1234.5678)
.divide(
new BigDecimal(1.19),
4,
RoundingMode.CEILING
);
BigDecimal bd2 = new BigDecimal(1234.5678)
.divide(
new BigDecimal(1.19),
new MathContext(4, RoundingMode.CEILING)
);
Результат:
bd1: 1037.4520
bd2: 1038
Вы усугубили пример. Не используйте двойные литералы для конструкторов BigDecimal, если можете этого избежать. Точность с плавающей запятой делает пример меньше понятным. 1234.5678 не будет 1234.5678.
@ Майкл В том-то и дело. Мой реальный пример похож на нечто подобное. У меня что-то вроде 2074523.35687 в качестве ввода
Затем используйте строку




Потому что в MathContext(4, RoundingMode.CEILING) 4 - это точность, а в .divide(new BigDecimal(1.19), 4, RoundingMode.CEILING); 4 - это масштаб. Вы можете увидеть разницу между "точностью" и "масштабом" здесь
One important point that is alluded to but not directly addressed is the difference between "precision" and "scale" and how they are used in the two statements. "precision" is the total number of significant digits in a number. "scale" is the number of digits to the right of the decimal point.
Итак, если вы измените второй на
final BigDecimal bd2 = new BigDecimal(1234.5678)
.divide(
new BigDecimal(1.19),
new MathContext(8, RoundingMode.CEILING)
);
У вас такие же результаты:
1037.4520
1037.4520
Я так понимаю, MCVE, который я собрал для вас, демонстрирует проблему?