У меня возникла проблема при попытке рассчитать процент на основе списка массивов.

int total = 0;
    double percentage = 0;
    for(int i = 0; i < accountList.size(); i++){
        total += Integer.parseInt(accountList.get(i).getTotalCount());
    }

    for(int j = 0; j < accountList.size(); j++){
        percentage = Math.round(Double.parseDouble(accountList.get(j).getTotalCount()) / (double)total);
        Log.i("PCT", String.valueOf(percentage));
    }

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

Однако, когда я пытаюсь распечатать процент, я получаю 0,0. Но затем, когда я распечатал общую сумму, она вернула мне сумму.

Любые идеи?

Заранее спасибо.

0
user2531590 6 Фев 2015 в 15:46

2 ответа

Лучший ответ

Скорее всего, все ваши фракции меньше 0,5, поэтому, округляя фракцию, вы продолжаете получать 0.

Я подозреваю, что вы хотите напечатать процент, который в 100 раз превышает фракцию.

 long percentage = Math.round(100.0 * 
                Double.parseDouble(accountList.get(j).getTotalCount()) / total);

Или же

 long percentage = 100L*Integer.parseInt(accountList.get(j).getTotalCount()) / total;

Использование целочисленного результата может быть не идеальным. Я предлагаю добавить такую ​​цифру точности.

 double percentage = 1000L 
                     * Integer.parseInt(accountList.get(j).getTotalCount()) 
                     / total / 10.0;

Умножив в 10 раз то, что вам нужно для вычисления целых чисел, вы получите дополнительную цифру точности при делении на 10,0.

Например

100 * 1 / 3 == 33
1000 * 1 / 3 / 10.0 == 33.3
1
Peter Lawrey 6 Фев 2015 в 12:57

% = Value / Total * 100

Итак, расчет должен быть:

percentage = Math.round((Double.parseDouble(accountList.get(j).getTotalCount()) * 100.0) / (double)total);
2
a_pradhan 6 Фев 2015 в 12:50