объяснение расчета процента c # - PullRequest
0 голосов
/ 07 июня 2018

У меня есть некоторые проблемы с пониманием, с вычислением процентов в c #

Почему это работает.

100 * usedDiskSpace/maxDiskSpace

, а это не ...

((usedDiskSpace/maxDiskSpace)*100)

Я не понял.

Почему?

для лучшего объяснения.Я пытаюсь рассчитать процент от объема жесткого диска.Я программировал на других языках, таких как Actionscript или PHP, или JAVA.Я не понимаю, почему результат нижнего вычисления приведет к значению 0.

Ответы [ 5 ]

0 голосов
/ 07 июня 2018

Это потому, что вы сделали целочисленное деление.Просто наберите float или double для достижения желаемого результата.

int usedDiskSpace = 230, maxDiskSpace = 980;

// integer division
int res = 100 * usedDiskSpace / maxDiskSpace;
// 23
res = ((usedDiskSpace / maxDiskSpace) * 100);
// 0

// floating point division
float resF =100f * usedDiskSpace / maxDiskSpace;
// 23.4693871
resF = (((float)usedDiskSpace / maxDiskSpace) * 100);
// 23.4693871
0 голосов
/ 07 июня 2018

В математическом исчислении расположение скобок является определяющим.В следующем выражении:

100 * usedDiskSpace / maxDiskSpace

сначала 100 , умноженное на usedDiskSpace , затем разделенное на maxDiskSpace .Например:

100 * 50/20 = 5000/20 = 250

Но во втором вычисление выглядит следующим образом:

((usedDiskSpace / maxDiskSpace) * 100)

сначала usedDiskSpace делится на maxDiskSpace , затем умножается на 100 .Предыдущий пример в этом сценарии действует следующим образом:

((50/20) * 100) = 2 * 100 = 200

Обратите внимание, что если переменные usedDiskSpace и maxDiskSpace являются целочисленными, в этом случае результат деления будет целым:

50/20 = 2 (не 2,5)

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

0 голосов
/ 07 июня 2018

Целочисленное деление и Порядок операций

Когда вы делите два целых числа , вы получаете целочисленный результат.Допустим, у вас есть значения 40 и 50.Когда у вас есть целые числа, 40/50 это просто 0.В целочисленной стране нет такой вещи, как .8.Даже если вы также умножите на 100, деление уже произошло, а 100*0 все еще равно 0.

Но если вы умножите числитель на 100 сначала , вы получите 4000/50.Это все еще оставляет место для целочисленного результата: 80.

Вот что здесь произошло.Первый пример выполняет умножение первым.Во втором примере сначала выполняется деление.

0 голосов
/ 07 июня 2018

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

Другие ответы хороши, если вы ищете результат, представляющий собой целое число (например, 10%).Если вы ищете результат с несколькими десятичными точками (например, 10.57%), рассмотрите возможность использования:

var bob = ((usedDiskSpace * 1.0 / maxDiskSpace) * 100);

или даже проще:

var bob = usedDiskSpace * 100.0 / maxDiskSpace;

Умножение на 1.0 (или100.0) будет гарантировать, что целочисленное деление не используется (поскольку 1.0 и 100.0 double.

0 голосов
/ 07 июня 2018

У вас другой порядок операций.

Ваш первый пример, 100 * usedDiskSpace/maxDiskSpace, совпадает с (100*usedDiskSpace)/maxDiskSpace.

Ваш второй пример, (usedDiskSpace/maxDiskSpace)*100 выполняет делениедо умножения.В целочисленном делении все после целого числа усекается.Поскольку (предположительно) maxDiskSpace всегда больше, чем usedDiskSpace, результат будет 0 * 100 или 0.

Мы можем проработать это с некоторыми игрушечными числами для примера.

int a = 10;
int b = 20;

Console.WriteLine(100*a/b); // Output: 50
// 100*10/20
// (100*10)/20
// 1000/20
// 50
Console.WriteLine((a/b)*100); // Output: 0
// (10/20)*100
// (0)*100 <- 0, rather than 0.5 due to how integer division works
// 0
...