Разделение целых чисел на Java

Это основной вопрос, но я не могу найти ответ. Я просмотрел арифметику с плавающей запятой и несколько других тем, но ничто не показалось для этого. Я уверен, что у меня есть неправильная терминология.

В принципе, я хочу взять два количества - завершенные и итоговые - и разделить их, чтобы получить процент (от того, сколько было выполнено). Величины long s. Здесь настройка:

long completed = 25000;
long total = 50000;

System.out.println(completed/total);  // Prints 0

Я попытался переназначить результат в double - он печатает 0.0. Где я ошибаюсь?

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

Кстати, не домашнее задание здесь просто старое numskull-ness (и, возможно, слишком много кодирования сегодня).

Ответ 1

Преобразование вывода слишком поздно; расчет уже выполнен в целочисленной арифметике. Вам нужно преобразовать входы в double:

System.out.println((double)completed/(double)total);

Обратите внимание, что на самом деле вам не нужно их конвертировать; пока один double, другой будет неявно преобразован. Но я предпочитаю делать и то и другое, для симметрии.

Ответ 2

Вам даже не нужны двойники. Просто сначала умножьте на 100, а затем разделите. В противном случае результат будет меньше 1 и будет усечен до нуля, как вы видели.

edit: или если переполнение возможно, если оно переполнится (т.е. дивиденд больше 922337203685477581), сначала разделите делитель на 100.

Ответ 3

Преобразуйте как completed, так и total в double или, по крайней мере, отрисуйте их до double при выполнении этого процесса. То есть приведение валиблов к удвоению не только результата.

Справедливое предупреждение, при работе с float и double существует проблема с плавающей запятой.

Ответ 4

Если вы не используете явно одно из двух значений для float, прежде чем выполнять разделение, будет использоваться целочисленное деление (так что вы получите 0). Вам просто нужно, чтобы один из двух операндов был значением с плавающей точкой, так что используется нормальное деление (а другое целочисленное значение автоматически превращается в float).

Просто попробуйте

float completed = 50000.0f;

и все будет хорошо.

Ответ 5

In Java
Integer/Integer = Integer
Integer/Double = Double//Either of numerator or denominator must be floating point number
1/10 = 0
1.0/10 = 0.1
1/10.0 = 0.1

Просто напечатайте любой из них.

Ответ 6

Как объясняется JLS, операция с целым числом довольно проста.

Если целочисленный оператор, отличный от оператора сдвига, имеет хотя бы один операнд типа long, то операция выполняется с использованием 64-битной точности, а результат численного оператора имеет тип long. Если другой операнд не длинный, он сначала расширяется (§5.1.5), чтобы печатать длинным путем численного продвижения (§5.6).

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

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

int = int + int
long = int + long
int = short + short

Обратите внимание, что приоритет оператора важен, поэтому, если у вас есть

long = int * int + long

операция int * int приведет к int, она будет продвигаться в long во время операции int + long

Ответ 7

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

Итак, правильная импликация будет:

System.out.println((double)completed/total);