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 — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки