Подтвердить что ты не робот

Почему деление двух целых чисел возвращает 0.0 в Java?

int totalOptCount = 500;
int totalRespCount=1500; 
float percentage =(float)(totalOptCount/totalRespCount);

Почему это всегда возвращает значение 0.0? Также я хочу отформатировать это в формате 00.00 и преобразовать в строку?

4b9b3361

Ответ 1

Поскольку преобразование в float происходит после завершения деления. Вам нужно:

float percentage = ((float) totalOptCount) / totalRespCount;

Вы должны иметь возможность форматировать, используя что-то вроде:

String str = String.format("%2.02f", percentage);

Ответ 2

Если вы используете значения int, использование double может быть лучшим выбором и иметь меньшую ошибку округления. float может представлять значения int без ошибок до ~ 16 миллионов. double может точно представлять все значения int.

double percentage =(double) totalOptCount / totalRespCount;

Процент обычно умножается на 100, что означает, что вы можете бросить бросок.

double percentage = 100.0 * totalOptCount / totalRespCount;

Ответ 3

Целочисленное деление (включающее long, short, byte, char, int) в Java всегда возвращает int (или длинный, если один из параметров длинный), округляя до нуля. Ваше преобразование происходит после этого вычисления.

(На вопрос о форматировании уже отвечают другие ответы - в качестве альтернативы вы также можете посмотреть java.text.NumberFormat, особенно java.text.DecimalFormat.)

Ответ 4

String.format("%2.02f", (float)totalOptCount/totalRespCount);

Ответ 5

чтобы отформатировать двойной и распечатать в процентах, вы можете использовать

System.out.println(new DecimalFormat("##.##").format(yourDouble) + "%"));

Ответ 6

(totalOptCount/totalRespCount)

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

Если я сломаю это, это будет что-то вроде ниже

(double)(500/1500)

В соответствии с фактическим расчетом 500/1500 даст вам 0.33333, но компилятор преобразует его в целочисленный литерал, потому что оба операнда имеют тип int

(double)(0)


Компилятор получает инструкцию, чтобы сделать это значение 0 двойным, и вы получили 0.0 как результат

0.0

а затем вы можете изменить результат в любом формате, как это было предложено @Zach Janicki.

помните, что оба операнда одного типа, чем результат, будут иметь одинаковый тип.