Разделите два десятичных знака и приведите результат к int - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь привести результат деления к int в c #

Это мой код:

decimal testDecimal = 5.00; // testDecimal always is dividable by 0.25 with 0 rest
int times=0;

int times = testDecimal / Convert.ToDecimal(0.250); 

// error returned -> Cannot implicitly convert type 'decimal' to 'int'.

если я изменю свой актерский состав на

int times = (int) testDecimal / Convert.ToDecimal(0.250); 
//also returns an error: Cannot implicitly convert type 'decimal' to 'int'

Как я могу получить результат (20) в виде целого числа? Что я делаю неправильно?

Ответы [ 8 ]

0 голосов
/ 03 июля 2018

Я не уверен, почему у вас есть Convert.ToDecimal (0,250). Зачем преобразовывать число с плавающей запятой (0,250) в десятичную во время выполнения? Почему бы просто не использовать десятичный литерал (например, 0,25M)? Как отметили другие люди, вам нужно привести результаты деления к типу int, например:

decimal testDecimal = 5M;
int times = (int) (testDecimal / 0.25M);
Assert.AreEqual(20, times);

Кроме того, как отметили другие люди, вы можете подумать о том, как вы преобразуете десятичное значение в целое. Хотите ли вы поведение по умолчанию (что вы получаете от простого приведения), или вы хотите округлять вверх, округлять вниз, округлять до четности и т. Д.? В этом случае, поскольку деление дает интегральный результат, это не имеет значения, но в общем случае вам нужно подумать над этим.

Кстати, причина возникновения ошибки в этом коде:

int times = (int) testDecimal / Convert.ToDecimal(0.250); 

означает, что вы приводите testDecimal (5.0M) к int (5). Затем вы делите его на десятичную (0,25M), что дает десятичную (20,0M). Наконец, вы пытаетесь присвоить это десятичное число целому числу, и компилятор сообщает об ошибке.

НТН

0 голосов
/ 03 июля 2018

Прежде всего, вы должны добавить суффикс "M" к вашему объявлению testDecimal, в противном случае ваш 5.00 является буквенным, а не десятичным.

decimal testDecimal = 5.00M;

Теперь ваш компилятор не знает, что ваш результат деления является целым числом. Даже если ваше деление можно привести к «int», для него десятичное число, разделенное на другое, является десятичным числом, а не целым числом. Вы должны неявно разыграть его:

int times = (int)(testDecimal / 0.250M);

Работает для меня как шарм.

0 голосов
/ 03 июля 2018

Оберните ваше выражение в круглые скобки, чтобы вы могли преобразовать его:

// int times = (int)testDecimal / 0.250m; 
int times = (int)(testDecimal / 0.250m); 

Только примечание, убедитесь, что вы пытаетесь / ловите при конвертации, потому что не все значения decimal могут вписаться в int.

try
{
    times = (int)decimal.MaxValue;
}
catch(OverflowException ex)
{
    // Value was either too large or too small for an Int32.
}
0 голосов
/ 03 июля 2018

Если вы хотите, чтобы числовой литерал обрабатывался как десятичный, используйте суффикс m или M. Таким образом, нет необходимости использовать Convert.ToDecimal.

decimal testDecimal = 5.00M;
int times = (int)(testDecimal / 0.250M);
0 голосов
/ 03 июля 2018

Как все ответили, вам нужно добавить круглые скобки, чтобы привести результат вашего деления вместо того, чтобы просто пытаться разыграть первую часть, а затем получить ошибку после деления.

Я также хочу отметить, что нет необходимости использовать Convert.ToDecimal только для того, чтобы объявить вашу константу в качестве ацима, вы можете использовать C # суффиксы , чтобы сделать это:

int times = (int)(testDecimal / 0.250m);
0 голосов
/ 03 июля 2018

сначала вам не нужно конвертировать в десятичную, вы можете просто сделать 0.25m

и тогда вы можете сделать

times = (int) (testDecimal / 0.25m);

обратите внимание, что если число слишком велико, это может привести к неверному результату.

0 голосов
/ 03 июля 2018

Вы должны разыграть весь результат деления. попробуй как:

int times = (int) (testDecimal / Convert.ToDecimal(0.250)); 

Будьте осторожны, потому что это может привести к случайной арифметической ошибке с плавающей запятой в зависимости от того, какие значения вы используете. https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Вы можете избежать этого, сначала округлив значение.

(int) Math.Round(testDecimal / Convert.ToDecimal(0.250));

0 голосов
/ 03 июля 2018

Попробуйте это:

 times = (int)(testDecimal / Convert.ToDecimal(0.250));

Без лишних скобок он пытается преобразовать ТОЛЬКО testDecimal в целое число, а затем пытается неявно преобразовать результат int / decimal в целое число, что и является причиной ошибки.

В несвязанной заметке вы пытаетесь объявить переменную 'times' дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...