Раздражающее двойное значение

#c# #floating-point #progress-bar #double #decimal

#c# #с плавающей запятой #индикатор выполнения #двойное #десятичное

Вопрос:

Хорошо, кто-нибудь может объяснить, почему переменное смещение возвращается как 0? Мне нужно обновить индикатор выполнения, но значение меньше 100, поэтому смещение — это значение для увеличения тока, а затем обновить индикатор выполнения с помощью значения floor текущего значения, но когда он возвращается 0, он не обновляется!

 double offset = 0.000001;
int hmm = (image.Height * image.Width);
double current = 0;

MessageBox.Show(offset.ToString());
MessageBox.Show(hmm.ToString());
offset = 100 / hmm;// 0.01;// 100 / (image.Height * image.Width) * 10000;

MessageBox.Show(offset.ToString());
 

Ответ №1:

Вы выполняете целочисленное деление — оба hmm и 100 являются целыми числами. Поэтому, если hmm оно больше 100, оно всегда будет давать 0 в качестве результата. Преобразуйте любой операнд в a double , и он будет использовать арифметику с плавающей запятой. Например:

 double offset = 100.0 / hmm;
 

Ответ №2:

попробуйте использовать

  offset = 100./hmm;
 

Проблема в том, что вы используете целочисленное деление.

Ответ №3:

Вы выполняете целочисленное деление между 100 и hmm . Результатом всегда будет целое число, и вы видите, что оно выдает 0, потому hmm что больше, чем 100 в вашем случае.

Попробуйте это вместо:

 offset = 100f / hmm; // the trailing f makes 100 a float
 

Ответ №4:

Проблема заключается в последней строке кода. Если вы напишете 100 / hmm, результат будет рассматриваться как целочисленное значение, поскольку 100 является целым числом. Попробуйте использовать

 ((double)100)/hmm;
 

Ответ №5:

Целочисленное деление всегда отбрасывает десятичную точку. Следовательно, что-то вроде 1 / 100 = .01 просто станет 0 .

Ответ №6:

hmm — это целое число. Попробуйте объявить его как значение с плавающей запятой или double или использовать его как таковое при выполнении вычисления.

IE.

 offset = 100 / ((double)hmm);