Почему я не могу получить процент при помощи Интервала

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

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

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

23
задан Aaronaught 8 April 2010 в 18:27
поделиться

9 ответов

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

decimal c = ((decimal)a / b) * 100;
58
ответ дан 29 November 2019 в 00:44
поделиться

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

В 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)
1
ответ дан 29 November 2019 в 00:44
поделиться

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

decimal c = (a * 100) / b;

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

9
ответ дан 29 November 2019 в 00:44
поделиться

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

decimal c = (0) * 100

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

decimal c = ((decimal)a/(decimal)b) * 100
14
ответ дан 29 November 2019 в 00:44
поделиться

Сделайте десятичным c = (a * 100) / b;

0
ответ дан 29 November 2019 в 00:44
поделиться

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

0
ответ дан 29 November 2019 в 00:44
поделиться

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

decimal c = (a / (decimal)b) * 100; 
2
ответ дан 29 November 2019 в 00:44
поделиться

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

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

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

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

десятичное c = ((десятичное) a) / ((десятичное) b) * 100;

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

1
ответ дан 29 November 2019 в 00:44
поделиться

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

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

0
ответ дан 29 November 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: