C # простая математическая функция

#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». Хороший улов.