2014-09-08 3 views
0

Я пытаюсь добавить несколько больших чисел, чтобы сделать взвешенную долю. Если во фракцию (a, b, c) входят три числа, взвешенная фракция должна быть: (1/a)/((1/a) + (1/b) + (1/c))BigDecimal добавление в java

На данный момент я только пытаюсь исправить знаменательную часть фракции. Сортированный массив: {{15 9 13}, {15 18 16}, {9 18 12}, {13 12 16}, {17 24 25}}

Я пытаюсь использовать большое десятичное число после двойного и float, похоже, не захватывают очень маленькую фракцию, которая возникает в результате взвешивания. Однако даже с большим десятичным значением, распечатка еще 0. Что я делаю неправильно?

public static BigDecimal[][] weights(int[][]sorted, int k){ 
    BigDecimal [][] weighted = new BigDecimal[sorted.length][k]; //k=3 
    BigDecimal denom = BigDecimal.ZERO; 
    for (int i = 0; i<sorted.length; i++){ //sums to create denominator value 
     for(int j = 0; j<sorted[i].length; j++){ 
      denom = denom.add(new BigDecimal(1/sorted[i][j])); 
      System.out.println("denom " + denom); 
     } 
    } 

    return weighted; 
} 

Любая помощь была бы принята с благодарностью!

ответ

1

Даже с BigDecimal s вы все еще выполняете целочисленное деление до того, как значение даже входит в BigDecimal, с 1/sorted[i][j]. Целочисленное деление на Java должно привести к другому int, поэтому 1, деленный на любой положительный int 2 или больше, приведет к 0.

Используйте double литерал 1.0 для принудительной арифметики с плавающей запятой.

1.0/sorted[i][j] 

Тогда вы обнаружите, что BigDecimal ненужно и doubledenom будет хорошо работать.

+0

PERFECT! Теперь он работает :) – user3369920

+0

Если вы хотите получить точный номер, продолжайте использовать 'BigDecimal'. –

+0

@JonathanDrapeau Как правило, 'BigDecimal' более точны, но то, что здесь передается, -« double ». – rgettman