Умножение числа на дробь - PullRequest
2 голосов
/ 24 марта 2019

Я писал некоторые конвертеры единиц измерения с использованием BigDecimals, и я столкнулся с ситуацией, когда мне приходилось умножать число на дробно-периодическое число.

В большинстве случаев точность достаточно хорошая, но допустим, что у нас есть уравнение типа:

BigDecimal.valueOf(90)
          .multiply(BigDecimal.valueOf(10)
                              .divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP))

Обычно это равняется 10, однако из-за округления мы получим 9.999999 ...

Есть ли элегантный способ реализовать это, не имея условия if, определяющего, когда дробь может быть вырезана?

Ответы [ 2 ]

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

Будет работать следующее:

BigDecimal.valueOf(90)
    .multiply(BigDecimal.valueOf(10))
    .divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP)

Разница в том, что здесь операции объединены в цепочку, что позволяет разрешать такие случаи.В вашем решении необходимо рассчитать деление (где происходит ошибка) и затем умножение, поскольку оно передается в качестве аргумента.

1 голос
/ 24 марта 2019

Не знаю, будет ли это общий ответ для вас, но он работает в приведенном примере:

bd = BigDecimal.valueOf(90)
               .multiply(BigDecimal.valueOf(10))
               .divide(BigDecimal.valueOf(90));

Умножьте на 10 , затем , разделите на 90.

a * x = ax
    -   --
    z    z

Вам потребуется включить некоторую логику округления для рациональных чисел:

bd = BigDecimal.valueOf(1)
               .multiply(BigDecimal.valueOf(1))
               .divide(BigDecimal.valueOf(3));

Сбой без округления.

...