Как заставить эту математику использовать два знака после запятой? - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть этот код здесь для контроля состояния передачи байтового массива. Проблема в том, что это всегда заканчивается целым числом. Я обновляю таблицу в БД каждые 10%, поэтому важно знать, когда она точно равна 10,00%, иначе сотни вызовов БД могут происходить каждые 10%.

Есть идеи? Я сосу математику:)

double percentageComplete = 0;
percentageComplete = (int)(totalReadCount / (double)fileSize * 100);

Ответы [ 5 ]

2 голосов
/ 29 ноября 2011

Возможно, вы захотите рассмотреть другой способ обновления вашей базы данных. Проверка на то, когда число равно «10%» или «10,00%», не является надежной.

Вместо этого проверьте, когда он составляет> этот процент, а затем установите флаг, чтобы указать, что вы выполнили обновление базы данных для этого процента.

1 голос
/ 29 ноября 2011

Снимите литой, у вас есть это:

percentageComplete = (int)(totalReadCount / (double)fileSize * 100);

Измените его на это:

percentageComplete = (totalReadCount / (double)fileSize * 100);

0 голосов
/ 29 ноября 2011

Вы преобразуете double в int, поэтому, конечно, вашим результатом будет целое число, которое сокращает конечные десятичные дроби.Таким образом, если у вас double равно 8,9, будет усечено до 8, а 8,1 будет усечено до 8. Таким образом, если ваши 10% близки к 9, ваши 10% будут крайне неточными, потому что они обрезались до 8.

Для «точных» 10% байты не могут быть разделены, поэтому наилучшее значение, которое вы можете получить, - это приближение.

Файл длиной 11 111 байтов будет иметь 111,11 байта как 10%, но компьютеры читают целые байты, как если бы у вас было 11,111 человек, вы не можете взять точные 10%, потому что разделение человека на 0,11% от человека + 111 человек не вариант.

Таким образом, вы получаете наилучшее приближение через округление.

int fileSize10p = Math.Round((double)fileSize / 10.0); //10% of file size

if(fileSize10p ==  totalReadCount){
  //do something
}
0 голосов
/ 29 ноября 2011

Ниже приведен желаемый результат

percentageComplete = (totalReadCount / (double)fileSize * 100);
0 голосов
/ 29 ноября 2011

Почему вы приводите его к (int) после того, как вычислили его?Удалите (int) приведение, тогда все должно быть в порядке.

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