Почему я не могу получить процент с помощью Int - PullRequest
22 голосов
/ 08 апреля 2010

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

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

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

Ответы [ 9 ]

57 голосов
/ 08 апреля 2010

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

decimal c = ((decimal)a / b) * 100;
14 голосов
/ 08 апреля 2010

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

decimal c = (0) * 100

Лучше сделать,

decimal c = ((decimal)a/(decimal)b) * 100
9 голосов
/ 08 апреля 2010

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

decimal c = (a * 100) / b;

Редактировать: если вам нужно более точное значение, а не «целочисленный процент» (т. Е. 33,333% вместо 33%), вам следует использовать ответ Брагаадиша.

2 голосов
/ 08 апреля 2010

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

decimal c = (a / (decimal)b) * 100; 
1 голос
/ 08 апреля 2010

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

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

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

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

ТЛ; др:

В C #:

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)
1 голос
/ 08 апреля 2010

Математическая математика - это целочисленная математика.

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

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

Я предлагаю это:

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

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

0 голосов
/ 08 апреля 2010

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

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

0 голосов
/ 08 апреля 2010

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

0 голосов
/ 08 апреля 2010

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

...