2016-08-30 2 views
1

Я вычислял простую комбинацию с помощью java, когда я определяю результат как двойной, ответ кажется правильным, только потерял некоторую точность, но когда я использую класс BigInteger, ответ выглядит просто неправильно, я не понимаю, почему это так, вот код.BigInteger Wrong Answer

import java.math.BigInteger; 
import java.util.Scanner; 


public class Test { 

public static void main(String[] args){ 

    Scanner in = new Scanner(System.in); 
    System.out.println("Please input the lottery sum"); 
    int num = in.nextInt(); 
    System.out.println("Please input the available sum"); 
    int avail = in.nextInt(); 

    //double sum = 1; 
    BigInteger sum = BigInteger.ONE; 

    for (int i = avail - 1; i >= 1;i--){ 
     //sum = sum*(num - i)/i; 
     sum = sum.multiply(BigInteger.valueOf(num - i)).divide(BigInteger.valueOf(i)); 
    } 

    //sum = sum * num/avail; 
    sum = sum.multiply(BigInteger.valueOf(num)).divide(BigInteger.valueOf(avail)); 
    System.out.println(sum); 

    in.close(); 
} 
} 
+2

Вы должны использовать BigDecimal вместо – Plirkee

+2

Это поможет, если вы предоставите [mcve] вместо этого, показывая ровно один расчет, а также ожидаемый и фактический вывод. Кажется вероятным, что вы как-то ожидаете, что «BigInteger» будет представлять нецелые значения, но это трудно сказать, поскольку вы не указали расчет. –

ответ

3

Основное различие между double и BigInteger является то, что один использует флоат-точечные математику, а другие используют целые математики. Это означает, что, когда вы используете BigInteger, результат каждого деления становится усеченным.

0

Я не уверен, что вы рассчитываете, но я подозреваю, что целочисленное деление - вот что вызывает наблюдаемые различия.

Я полагаю, что вы получите тот же результат с BigInteger и регулярным int для небольших примеров.

Например: дважды: 3,0/2,0 = 1,5

(Большой) Integer: 3/2 = 1

Если просуммировать такое разделение несколько раз, несоответствие становится все больше и больше ,

Взгляните на BigDecimal, это может быть решение, которое вы хотите, чтобы избежать этой ошибки, введенной целыми делениями.

Смежные вопросы