Есть ли Math.floorDiv (a, b), но для BigInteger? - PullRequest
4 голосов
/ 29 июня 2019

Некоторый способ сделать Math.floorDiv(a, b); и вернуть деление на два значения BigInteger
Пример:

BigInteger big0 = new BigInteger("10");
BigInteger big1 = new BigInteger("20");
Math.floorDiv(big0, big1);

Ответы [ 2 ]

7 голосов
/ 29 июня 2019

Переключитесь на BigDecimal, и вы сможете контролировать округление. Шкала 0 означает, что результаты округляются до целого числа, а FLOOR округляется до отрицательной бесконечности.

big0.divide(big1, 0, RoundingMode.FLOOR)

(Если вы создаете big0 из int, long или BigInteger, тогда его масштаб будет уже 0, и вы можете опустить средний аргумент.)

2 голосов
/ 29 июня 2019

В API BigInteger такого метода не существует.

Однако вы могли бы реализовать его, используя BigInteger::divideAndRemainder ( javadoc ) и настроив результат, аналогичный спецификации Math::floorDiv.Как то так:

BigInteger a = new BigInteger("10");
BigInteger b = new BigInteger("20");

BigInteger c = floorDiv(a, b);

public BigInteger floorDiv(BigInteger a, BigInteger b) {
    // divideAndRemainder returns quotient and remainder in array
    BigInteger[] qr = a.divideAndRemainder(b);  
    return qr[0].signum() >= 0 || qr[1].signum() == 0 ? 
         qr[0] : qr[0].subtract(BigInteger.ONE);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...