2014-12-26 6 views
-2

Я работаю с двумя циклами, каждый из которых служит для распределения данных внутри таблицы. , за исключением переменной «mol», которую я получил из раскола массива, поэтому умножаю его на значение, содержащееся в NumericUpDown. Умножение выполняется успешно, но при запуске нового цикла значение, очевидно, заменяется. Как сделать, чтобы сохранить в памяти значение до сих пор и умножить его на следующие значения? ПримерУмножение не возвращает точный результат

Dim giocata = NumericUpDown1.Value 

    For Each key In combinations 
     For Each combination In key 
      Dim valore = combination.Split(",") 
      quota = Convert.ToDouble(valore(3), New CultureInfo("en-US")) 'utile per il punto 
      MessageBox.Show(quota) 
       mol = quota * giocata 
       MessageBox.Show(mol) 
       dt.Rows(contatore).Item(valore(4)) = valore(1) & "-" & valore(2) 
     Next 
     dt.Rows(contatore).Item(moltiplicatore(k)) = mol 
     mol = 0 
     contatore = System.Threading.Interlocked.Increment(contatore) 
    Next 

Проблема:

моль = 3,60 * 2 = 7,20

новый цикл

моль = 1,90 * 2 = 3,80

Но должно быть:
mol = 3,60 * 2 = 7,20
новый цикл
моль = 2 * 1,90 * 7,20 = 27,36

+1

вам нужна форма/class level для сохранения результата – Plutonix

ответ

2

Внутри внутреннего цикла вы всегда пересчитывать значение mol с использованием текущих значений.
Итак, когда вы выходите из этого цикла, значение mol всегда вычисляется последним.

Чтобы устранить проблему, в соответствии с вашими, например, данные, вы должны умножить текущее значение mol к значениям (quota * giocata) и установить mol в результате этого умножения

Это просто (в VB.NET)

mol = mol * (quota * giocata) 

Но в первом цикле вам необходимо инициализировать значение mol иначе 0 * ... произвести ноль в качестве результата. Поэтому вам нужно добавить if, если нужно проверить, должна ли быть установлена ​​переменная mol для текущего цикла в коллекции key.

mol = 0 
For Each combination In key 
    Dim valore = combination.Split(",") 
    quota = Convert.ToDouble(valore(3), New CultureInfo("en-US")) 'utile per il punto 
    Dim temp = quota * giocata 
    if mol = 0 Then 
     mol = temp 
    else 
     mol = mol * temp 
    End if 
    dt.Rows(contatore).Item(valore(4)) = valore(1) & "-" & valore(2) 
Next 

Обратите также внимание на необходимости перемещать установку к нулю моля в начале внутреннего цикла, а не в конце его, если вам необходимо иметь это значение вне цикла

+0

Я уже пробовал так, это всегда возвращает 0 ... , если моль еще не был рассчитан, тогда у меня будет 0 –

+0

@JessePinkman, вы правы, это нужно решать внутри петля с проверкой на значение моля – Steve

Смежные вопросы