Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
04 Июн 2024
2 мин
246

Исключение ArithmeticException: «Non-terminating decimal expansion; no exact representable decimal result» в Java

Существует типичная проблема, с которой могут столкнуться начинающие программисты при использовании класса BigDecimal в Java. Это исключение ArithmeticException

Существует типичная проблема, с которой могут столкнуться начинающие программисты при использовании класса BigDecimal в Java. Это исключение ArithmeticException с сообщением об ошибке «Non-terminating decimal expansion; no exact representable decimal result».

Пример:

BigDecimal num1 = new BigDecimal("2.0");
BigDecimal num2 = new BigDecimal("3.0");
num1.divide(num2); // вызывает исключение

В данном случае, при попытке выполнить деление num1.divide(num2), возникает исключение ArithmeticException.

Это происходит потому, что результат деления 2.0 на 3.0 в десятичной системе счисления не имеет конечного (т.е. терминирующего) представления. В действительности, результатом является бесконечно повторяющаяся десятичная дробь 0.6666666....

В Java класс BigDecimal предназначен для точных вычислений с десятичными числами. Однако, по умолчанию, при делении двух чисел класс BigDecimal требует, чтобы результат был точно представим в десятичной форме. Если это не так (как в примере выше), то возникает исключение ArithmeticException.

Чтобы избежать этой проблемы, можно использовать одну из перегруженных версий метода divide(), которая принимает два аргумента: делитель и MathContext или точность результата (количество знаков после запятой).

Пример исправления:

BigDecimal num1 = new BigDecimal("2.0");
BigDecimal num2 = new BigDecimal("3.0");
num1.divide(num2, 2, RoundingMode.HALF_UP); // возвращает 0.67

В этом примере, используется метод divide() с тремя параметрами: делитель, точность результата (2 знака после запятой) и стратегия округления (RoundingMode.HALF_UP). Таким образом, возможно получить приемлемый результат, даже если точное десятичное представление невозможно.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий