Подтвердить что ты не робот

Почему я не могу получить процент, используя Int

Пожалуйста, простите мое знание программирования. Я знаю, что это просто, но я не понимаю, почему результат всегда равен 0. Почему десятичное будет в порядке?

int a = 100;
int b = 200;
decimal c = (a / b) * 100;

Большое спасибо.

4b9b3361

Ответ 1

Целочисленное деление всегда усекает остаток. Это делается в то время, когда число делится, а не когда оно назначается переменной (как я предполагаю, вы предполагали).

decimal c = ((decimal)a / b) * 100;

Ответ 2

Значение a/b всегда будет возвращать 0, так как они являются целыми числами. Поэтому, когда значения в скобках оцениваются, вы технически выполняете это

decimal c = (0) * 100

Лучше,

decimal c = ((decimal)a/(decimal)b) * 100

Ответ 3

100/200 составляет 1/2 или 0,5. Поскольку вы используете ints, он округляется до 0 (ноль). И 0 * 100 все равно 0. Часть внутри скобок всегда оценивается сначала: если вы хотите получить эту работу, используйте:

decimal c = (a * 100) / b;

Изменить: если вы хотите получить более точное значение, а не "целочисленный процент" (т.е. 33.333% вместо 33%), вы должны использовать ответ Bragaadeesh.

Ответ 4

Выполняется математическая математика, и результат затем сохраняется как десятичный. 100/200 в целочисленной математике равно 0. Чтобы получить свой процент, произведите по крайней мере одно значение до десятичного числа, прежде чем делать расчет.

decimal c = (a / (decimal)b) * 100; 

Ответ 5

Выполняемая математика по-прежнему является целочисленной математикой.

(a/b) (100/200 или 1/2) выполняется на двух целых числах, поэтому результат равен нулю. Нуль * 100... ну, все равно ноль.

Проблема, с которой вы столкнулись, связана с порядком операций (a и b являются целыми числами, поэтому выполняется целая математика).

Я предлагаю следующее:

decimal c=((decimal)a)/((decimal)b)*100;

Это заставит математику выполнить десятичные значения, которые вы ищете.

Ответ 6

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

С# имеет список неявных числовых преобразований, он будет делать.

Обобщение этого списка: интегральные типы могут быть преобразованы в типы с плавающей точкой, но не наоборот. Интегральные типы также могут быть неявно преобразованы в decimal, но типы с плавающей запятой не могут.

Примечание. Это также означает, что приведение одного из типов к другому типу приведет к тому, что весь ответ будет таким. ex: (decimal) a / b * 100.0 = 50.0

TL;DR:

В С#:

int / int = int
int + decimal = decimal
decimal + int = decimal
int / int * decimal = (int / int = int) * decimal = decimal
int - float = float
int * double = double
float / decimal = an error
int - uint = an error (either that or ulong)

Ответ 7

Сделайте это decimal c = (a * 100) / b;

Ответ 8

int может быть только целыми числами, поэтому 100/200 будет 0. 0 * 100 все равно 0. Измените тип на десятичный, и он будет работать

Ответ 9

При использовании целых чисел это '/' означает DIV и этот% для MOD. DIV является фактором разделения, MOD - это остальное. Итак, 100/200 = 0 и 100 %200 = 100.

Итак, вам нужно изменить типы a и b на decimal, в вашем случае.