BigDecimal.divide() без scale — рабочий код до первого 1/3
Деление двух BigDecimal без явного scale и RoundingMode компилируется и работает — пока делимое даёт конечную десятичную дробь. 10 разделить на 2 даёт 5, 100 разделить на 4 даёт 25 — тесты зелёные, ревью прошло.
Первое же деление, где результат бесконечен в десятичной системе — 10 разделить на 3 — бросает ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. BigDecimal не округляет по умолчанию, потому что точность — весь его смысл, округление обязано быть явным решением.
BigDecimal a = new BigDecimal("10"); BigDecimal b = new BigDecimal("3"); BigDecimal c = a.divide(b); // ArithmeticException
BigDecimal d = a.divide( b, 2, RoundingMode.HALF_UP );
Спросят следом: чем divide(BigDecimal, MathContext) отличается от divide с явным scale. MathContext округляет по общей точности числа, а не по количеству знаков после запятой — на деньгах это разные результаты, если не свести их к одному масштабу заранее.
Финал: у BigDecimal нет операции «просто разделить» — есть только операция с явно указанным правилом округления.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки