2010-04-08 2 views
22

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

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

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

+3

с = (а * 100)/б; – kenny

+3

Это не сработает. a * 100/b по-прежнему усекает десятичную и затем преобразует в десятичный тип. У вас не будет мантиссы. – Armstrongest

+1

c = (a * 100M)/b; Кроме того, см. Http://mathworld.wolfram.com/IntegerDivision.html – Greg

ответ

54

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

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

Усечение также известно как математическая операция Пола. –

+0

+1 для минимального изменения, чтобы исправить ответ. –

+4

@ rlb.usa: Является ли это надлежащим полом, зависит от того, как он обрабатывает негативы. Вне руки, я считаю, что он меняет -1,2 на -1, а не на -2. –

13

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

decimal c = (0) * 100 

лучше сделайте,

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

-1 за путаницу и вводящий в заблуждение ответ. 'int/int = int', который вы, кажется, знаете, но не объясняете. – ANeves

+2

«a/b всегда будет возвращать 0», если для 'a' и' b' не заданы разные значения, и в этом случае это будет 'a/b'. –

9

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

decimal c = (a * 100)/b; 

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

+0

Как я сказал Стю Макеллару, это не работает, потому что оно усекает. –

+2

Если вы переписали это как '(a * 100M)/b', вы получите желаемый результат. –

+0

@Steven, как я сказал вам в своем ответе, это может быть то, что хочет Даомин. Именно так я интерпретировал его запрос, учитывая, что он начинает с ints и хочет процент. @Anthony также, я * хочу * целочисленный ответ. – tloflin

0

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

+0

Я не думаю, что это сработает, как вы себе представляете. Он будет округлен. Например, если a = 1 и b = 3, мы хотим, чтобы c было равно 33.333 (до тех пор, пока мы не сможем удерживать столько конечных 3). С вашим кодом у нас будет 33.0 –

+0

True. ОП не упомянул, что ему нужен реальный номер, но я предполагаю, что это подразумевается десятичной точкой. –

+4

Если вы переписали это как '(a * 100M)/b', вы получите желаемый результат. –

2

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

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

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

1

математику делается по-прежнему целочисленная математика.

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

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

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

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

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

+0

Используйте 100.0M вместо 100, чтобы избежать стоимости неявного приведения. –

+0

Но тогда убедитесь, что вы используете 100.0M на первом op. (См. Другие ответы для уточнения.) – ANeves

0

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

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

1

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

У C# есть список implicit numeric conversions он будет делать.

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

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

TL; др:

В 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) 
+0

'100/200 * 100.0' все равно будет 0, даже если он даст десятичный результат - подумайте об этом. – ANeves

+0

@sr pt: Четвертый пример вниз адресов, которые. В частности, с цифрами, которые были заменены: '100/200 * 100.0 = (100/200 = 0) * 100.0 = 0.0' – Powerlord

 Смежные вопросы

  • Нет связанных вопросов^_^