Найти процент от одного целого до другого - PullRequest
4 голосов
/ 04 февраля 2011

У меня есть два целых числа (количество байтов в двух файлах).Один всегда меньше, если не совпадает с другим.Я хочу вычислить процент, что чем меньше, тем больше.

Я использую обычный C. Я применил математическую формулу, но получаю всегда 0:

printf("%d\r", (current/total)*100);

Есть идеи?

Ответы [ 5 ]

9 голосов
/ 04 февраля 2011

Попробуйте

printf("%g\r", (((double)current)/total)*100);

.Целочисленное деление всегда округляется до нуля.Преобразовав сначала одно из чисел в double, вы запустите деление с плавающей запятой.Если вы хотите использовать целочисленную арифметику, вы также можете использовать

printf("%d\r", (100*current)/total);

, которая будет печатать процент, округленный до следующего целого числа.

4 голосов
/ 04 февраля 2011

Свен даст вам хороший совет.

Если вы хотите сохранить свои целые числа, сделайте умножение перед делением:

printf("%d\r", (current * 100) / total);

Вы получите округленный результат.

Интегральное деление, выполненное с numerator < denominator, всегда дает 0. Это объяснение вашей проблемы «всегда 0».Умножив на 100 перед делением, вы получите неотъемлемую часть вашего деления (в процентах)

my2c

2 голосов
/ 04 февраля 2011

Я рекомендую увеличить знаменатель перед выполнением деления:

const float ratio = (100.f * current) / total;

Здесь, если сделать 100 литералом с плавающей запятой, это будет способствовать вычислению, поэтому никаких явных приведений не требуется, что также является преимуществом.

0 голосов
/ 04 февраля 2011

Целочисленное деление округляется в меньшую сторону, поэтому, если ваш ответ меньше 1, вы получите 0.

Вы можете попробовать что-то вроде этого:

printf("%d\r", ((current*100)/total));

Однако вы всегда получите целое число.

Если вы преобразуете числитель в число с плавающей точкой, вы получите деление числа с плавающей запятой и правильный ответ.

printf("%f\r", ((float)current/total * 100));

Однако вы можете захотеть обрезать нули после, например, за 3 цифры додесятичные и 2 после вы можете использовать:

printf("%3.2f\r", ((float)current/total * 100));

Выезд:

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

0 голосов
/ 04 февраля 2011

Лучше попробовать:

printf("%lf\r", (((double)current)/total)*100);

Поскольку ответ будет с плавающей точкой.

...