Подсказка IntelliJ при округлении результата потока деления BigDecimal - PullRequest
1 голос
/ 19 марта 2019

У меня немного странная проблема с подсказкой IntelliJ при делении результата в конце операции потока.

products.stream()
        .filter(
            order ->
                order.getEstimatedRealizationDate().compareTo(begin) > 0
                    && order.getEstimatedRealizationDate().compareTo(end) < 0)
        .map(order -> order.getProduct().getPrice())
        .reduce(ZERO, BigDecimal::add)
        .divide(valueOf(productList.size()))
        .setScale(3, RoundingMode.CEILING);

Независимо от того, как вы установили округление, IntelliJ постоянно заявляет, что операция деления может быть сопряжена с риском в виде ArtithmeticException в форме сообщения и операции деления с подсветкой.Я использовал любую из опций round ().

Сообщает о вызовах функцииdiv () или setScale () без аргумента режима округления.Такие вызовы могут привести к ArithmeticException, когда точное значение не может быть представлено в результате (например, потому что у него есть бесконечное десятичное расширение).Задание режима округления предотвращает исключение ArithmeticException.

У меня сложилось впечатление, что я пробовал все возможные варианты, но IntelliJ не сдается.Пожалуйста, предложите, что я делаю не так.Заранее спасибо за каждый вид помощи.

1 Ответ

3 голосов
/ 19 марта 2019

setScale просто возвращает BigDecimal объект с указанным масштабом.Вы хотите использовать перегруженный divide метод

divide(BigDecimal divisor, int scale, RoundingMode roundingMode):

products.stream()
        .filter(
            order ->
                order.getEstimatedRealizationDate().compareTo(begin) > 0
                    && order.getEstimatedRealizationDate().compareTo(end) < 0)
        .map(order -> order.getProduct().getPrice())
        .reduce(ZERO, BigDecimal::add)
        .divide(valueOf(productList.size()), 3, RoundingMode.CEILING);

В этом примере я использую RoundingMode.CEILING, но вот документы дляRoundingMode, если вы хотите использовать другой режим округления.

...