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

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

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


person kiran    schedule 08.02.2011    source источник


Ответы (6)


Потому что преобразование в число с плавающей запятой происходит после выполнения деления. Тебе нужно:

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

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

String str = String.format("%2.02f", percentage);
person unwind    schedule 08.02.2011
comment
Float(percentage)) в этом Float показывает ошибку - person kiran; 08.02.2011
comment
String str = String.format(%2.02f,(float)процент); изменился вот так. это сработало, спасибо расслабьтесь - person kiran; 08.02.2011

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

double percentage =(double) totalOptCount / totalRespCount;

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

double percentage = 100.0 * totalOptCount / totalRespCount;
person Peter Lawrey    schedule 08.02.2011
comment
Изменение 100 на 100.0 помогло, почему? Я использую двойной. - person felippe; 28.05.2016
comment
@luizfelippe распространенная ошибка - выполнять целочисленную операцию и приводить результат к двойному или плавающему значению. Вам нужно выполнить операцию как двойную, т.е. (double) (a / b), когда a и b являются целыми числами, это не то же самое, что (double) a / b Вы хотите позже. - person Peter Lawrey; 28.05.2016

(totalOptCount/totalRespCount)

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

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

(double)(500/1500)

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

(double)(0)


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

0.0

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

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

person Dheeresh    schedule 30.01.2017

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

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

person Paŭlo Ebermann    schedule 08.02.2011

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

System.out.println(new DecimalFormat("##.##").format(yourDouble) + "%"));
person Zach Janicki    schedule 16.06.2015

person    schedule
comment
где он хранит, в какой переменной - person kiran; 08.02.2011
comment
Посмотрите код unwind, он лучше объяснен. Мой код был просто для того, чтобы рассказать вам, как это сделать в одной строке, вы можете сохранить результат в переменной, если хотите - person Dalmas; 08.02.2011