#c#
#c#
Вопрос:
Я пытаюсь вычислить процент успешных заданий в целом. Код:
int total = valid invalid;
int percent = (valid / total) * 100;
if (percent == 0)
{
MessageBox.Show(Convert.ToString(total) ":" Convert.ToString(valid));
break;
}
Если все задания выполнены успешно, процент равен 100%.
Если одна работа плохая, процент равен 0, и я получаю сообщение с:
9:8
8/9 * 100 = 88,888, а не 0.
int percent = Convert.ToInt32((valid / total) * 100);
результата не дает. Пожалуйста, помогите мне.
Я русский, поэтому прошу прощения за плохой английский.
Комментарии:
1. Вы выполняете целочисленное деление…
Ответ №1:
Я предполагаю, что оба valid
и invalid
определяются как int
s . В этом случае результатом всех вычислений также будет int
s .
Вам либо нужно привести одно из значений к типу с плавающей запятой в операции, либо, и это, вероятно, было бы проще, определить одно из значений как тип с плавающей запятой для начала:
double total = valid invalid;
int percent = (valid / total) * 100;
Комментарии:
1. Другой вариант, который стоит отметить (если все, что вам нужно, это int), заключается в том, что вы можете просто изменить порядок вычислений. (допустимо * 100) / total будет работать (хотя, конечно, вы должны отметить, что конечным результатом будет целое число с обратным порядком, а не округленное обычно ожидаемым образом).
Ответ №2:
ваши действительные и итоговые переменные имеют значение int, что означает, что ваше действительное / итоговое деление будет усечено до целого числа, которое в вашей ситуации всегда будет равно 0.
Если бы вы изменили одну из переменных на double, это позволило бы выполнить разделение так, как вы ожидаете.
int percent = Convert.ToInt32(((double)valid / total) * 100);
Теперь это приведет к тому, что ваше предложение if больше не будет работать должным образом, поэтому вам придется изменить это, чтобы, вероятно, проверить, что оно не 100
поэтому вместо
if (percent == 0)
вы хотели бы сделать что-то вроде
if (percent != 100)
вместо
Ответ №3:
Вам просто нужно много работать с приведением, чтобы вы не выполняли целочисленное деление и не искали результат с плавающей запятой, например:
double percent = ((double)valid / total) * 100;
Ответ №4:
Ваша проблема в том, что вы работаете с целым числом (целое число), но для правильной работы деления вы должны использовать рациональное число.
Когда вы выполняете 8/9, у вас есть 0, потому что восемь меньше девяти, поэтому результат будет между 1 и 0. Для представления числа от 1 до нуля вы должны использовать тип с плавающей запятой.
float total = valid invalid;
Теперь разделение выглядит следующим образом:
8 / 9.0
но это еще не конец, если вы присвоите число с плавающей запятой целому числу, у вас будет предупреждение компилятора.
float result = (valid / total) * 100;
Ответ №5:
Сделайте так, чтобы ваша строка была:
int percent = (int)(((float)valid / (float)total) * 100f);
Ответ №6:
Преобразуйте ваши целые числа в числа с плавающей запятой перед выполнением вычислений.
int percent = Math.Round(((float)valid / (float)total) * 100);
Ответ №7:
Вам нужно использовать какую-то математику с плавающей запятой, а не целые числа.
int total = valid invalid;
int percent = ((decimal)valid / (decimal)total) * 100m;
Ответ №8:
Проблема в том, что результатом (valid / total)
является int
(целое число), как valid
и total
есть ints
, поэтому результат деления будет усечен до целого числа.
Решение состоит в том, чтобы заставить единицу быть a float
, double
или decimal
:
int percent = (int)Convert.ToInt32(((float)valid / total) * 100);
Ответ №9:
одним из ваших факторов должно быть значение с плавающей запятой, иначе в результате вы получите целое число.
int total = valid invalid;
int percent = (int)((valid / (float)total) * 100);
if (percent == 0)
{
MessageBox.Show(Convert.ToString(total) ":" Convert.ToString(valid));
break;
}
Ответ №10:
Вы должны использовать float
вместо int
:
float percent = ((float)valid/(float)total) * 100.00f;
Редактировать:
Да, я забыл привести vallid
и total
переместить.
Комментарии:
1. Разве это не будет иметь ту же проблему, что и (valid / total) будет int , перед преобразованием в float для выполнения умножения.
Ответ №11:
Попробуйте:
float total = valid invalid;
float percent = (valid / total) * 100;
if (percent == 0)
{
MessageBox.Show(Convert.ToString(total) ":" Convert.ToString(valid));
break;
}
Редактировать:
Процент также изменен на плавающий.
Комментарии:
1. Причина в том, что значение int, разделенное на другое значение int, всегда дает вам значение int . Если вы разделите целое число на число с плавающей запятой, вы получите число с плавающей запятой. Таким образом, ваше значение округляется до ближайшего значения int (либо 0, либо 1), а затем вы умножаете это на 100.
2. Вы забыли там приведение к int
3. Не приведет ли приведенное выше к ошибке компилятора во второй строке? (неявное преобразование ‘float’ в ‘int’)
4. Да, сделать «процент» плавающим, вероятно, было бы хорошей идеей, поскольку в исходном сообщении говорилось, что он хочет «88,888». Хороший улов.