2015-07-09 2 views
-3

Может быть, я провел слишком много ночей до конца, но я имел следующий код:Почему это возвращается 0?

MessageBox.Show(
    Convert.ToInt32(
    Math.Round(
     (double)((i+1)/r.Count)*100 , 
     0 
    ) 
).ToString() 
); 

Который всегда возвращает 0, даже когда i=120000 и r.Count=150000. Это простой расчет прогресса, где i - текущая итерация в цикле, а r - это коллекция (List()).

Я отделил код, и даже следующий по-прежнему возвращает 0:

Convert.ToInt32( 
      Math.Round( 
         (double)((120000+1)/167428)*100 
         , 0) 
       ) 

Не уверен, что происходит здесь, так что любое представление о том, что я делаю неправильно (возможно, лоб Slapper). Оно должно быть (с использованием выше цифр), возвращающая 71.

@ флаг Хабиба как дубликат:

что дублируют вы утверждаете - на самом деле разные, даже решения не применяются здесь, как это было вопрос о литье, чтобы удвоить, и , не добавляя 'm' с добавочными десятичными точками к каждой переменной в play.

+0

так, что вы, ребята, говорите (чтение ответов ниже), является то, что мне нужно отливать целые числа как удвоить первый, и что .NET не выполняет никакой магии при использовании математических операций (например, плавать число, если при необходимости делить два целых числа)? –

+0

нет только кастинг один сделаю, но сделайте это перед тем дивизия не после. –

+0

@SanuelJackson Он не может догадаться, чего вы хотите, а в некоторых случаях целое деление * - это то, что вы хотите. Нет, это не волшебство. – Borgleader

ответ

3

Ниже будет вычисляться (120000 + 1)/167428) до 0, поскольку они ИНТ и чего не держать десятичную точность, попробуйте этот

Convert.ToInt32(Math.Round(((double)(120000+1)/(double)167428) * 100)) 
+0

извините ... придется подождать 10 минут, чтобы принять сейчас ... o.0. Когда SO реализовал это? –

0

((120000 + 1)/167428) будет вычисляться 0

167428 не входит в 120001. то, что вы можете попробовать это:

Convert.ToInt32( 
     Math.Round( 
        (((double)120000f+(double)1f)/(double)167428f)*(double)100f 
        , 0) 
      ) 
4

Вы бросаете в два раза после выполнение целочисленного деления.

9

Потому что (120000+1)/167428 все еще выполняется с использованием целочисленной математики. Вместо ~ 0,716 это 0.

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

((double)(i+1)/(double)r.Count)*100 
+0

Ответ правильный, но я думаю, что вы имели в виду '~ 0.716'. Так или иначе, он все равно округляется до 0. Я просто OCD с математикой. : p –

+1

@DrewKennedy Извините, палец поскользнулся. –

2

это связано с неявном

https://msdn.microsoft.com/en-us/library/ms173105.aspx

операция: (120000+1)/167428 возвращает целое число, как результат, 0. вы выполняете двойное выполнение после выполнения этого целочисленного деления.

как другие пользователи предполагают попробовать заливке значения:

(double)(((float)120000f+1)/(float)167428f)*100 
+0

Действительно, ссылаясь на java-документ для вопроса C#? – leppie

+0

Почему идея не такая же, возможно, ваши знания - это только технологии C# или .net. – Jorgesys

+0

И? Уже было 5 других ответов, говорящих об этом. Недопустимое перенаправление является фолом. Но я вижу, что вы хотя бы исправили это. Благодарю. – leppie

0

Если r.Count>i+1, то (i+1)/r.Count даст вам ноль. Оба являются целыми числами, и поэтому все после запятой отключается.

Возможно, вы хотите сделать либо i+1, либо r.Count, чтобы удвоить, тогда вы получите ответ, который вы ожидаете.

Например:

(i+1)/(double)r.Count

0

Попробуйте это:

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

Convert.ToInt32( 
      Math.Round( 
         (((double)(120000+1))/167428)*100 
         , 0) 
       ) 
Смежные вопросы