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