Пожалуйста, простите мое знание программирования. Я знаю, что это просто, но я не понимаю, почему результат всегда равен 0. Почему десятичное будет в порядке?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
Большое спасибо.
Пожалуйста, простите мое знание программирования. Я знаю, что это просто, но я не понимаю, почему результат всегда равен 0. Почему десятичное будет в порядке?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
Большое спасибо.
Целочисленное деление всегда усекает остаток. Это делается в то время, когда число делится, а не когда оно назначается переменной (как я предполагаю, вы предполагали).
decimal c = ((decimal)a / b) * 100;
Значение a/b всегда будет возвращать 0, так как они являются целыми числами. Поэтому, когда значения в скобках оцениваются, вы технически выполняете это
decimal c = (0) * 100
Лучше,
decimal c = ((decimal)a/(decimal)b) * 100
100/200 составляет 1/2 или 0,5. Поскольку вы используете ints, он округляется до 0 (ноль). И 0 * 100 все равно 0. Часть внутри скобок всегда оценивается сначала: если вы хотите получить эту работу, используйте:
decimal c = (a * 100) / b;
Изменить: если вы хотите получить более точное значение, а не "целочисленный процент" (т.е. 33.333% вместо 33%), вы должны использовать ответ Bragaadeesh.
Выполняется математическая математика, и результат затем сохраняется как десятичный. 100/200 в целочисленной математике равно 0. Чтобы получить свой процент, произведите по крайней мере одно значение до десятичного числа, прежде чем делать расчет.
decimal c = (a / (decimal)b) * 100;
Выполняемая математика по-прежнему является целочисленной математикой.
(a/b) (100/200 или 1/2) выполняется на двух целых числах, поэтому результат равен нулю. Нуль * 100... ну, все равно ноль.
Проблема, с которой вы столкнулись, связана с порядком операций (a и b являются целыми числами, поэтому выполняется целая математика).
Я предлагаю следующее:
decimal c=((decimal)a)/((decimal)b)*100;
Это заставит математику выполнить десятичные значения, которые вы ищете.
В сильно типизированных языках результат математических операций обычно такой же, как у более крупного типа.
С# имеет список неявных числовых преобразований, он будет делать.
Обобщение этого списка: интегральные типы могут быть преобразованы в типы с плавающей точкой, но не наоборот. Интегральные типы также могут быть неявно преобразованы в 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)
Сделайте это decimal c = (a * 100) / b;
int может быть только целыми числами, поэтому 100/200 будет 0. 0 * 100 все равно 0. Измените тип на десятичный, и он будет работать
При использовании целых чисел это '/' означает DIV и этот% для MOD. DIV является фактором разделения, MOD - это остальное. Итак, 100/200 = 0 и 100 %200 = 100.
Итак, вам нужно изменить типы a
и b
на decimal
, в вашем случае.