2013-04-23 21 views
0

Я пытаюсь разделить целое число на десятичный/float/double. Я могу разделить целые числа, просто найти с помощью: int Num1 = 300/2;, но когда я попытаюсь сделать это «2» десятичным, это не сработает. Я видел, как люди упоминают об этом int Num1 = 300/((float)1.25);. Это, честно говоря, не имеет для меня никакого смысла ... Я также пробовал int Num1 = Decimal.Divide(300, 1.25); без везения.Разделите целое число на десятичное число

ответ

1

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

double Num1 = 300/2; 
double Num1 = 300/1.25; 
+0

'300/2' представляет собой целое деление, которое является то, что ОП пытается избежать. '300/2.0' лучше. – jaket

4

Проблема заключается в том, что вы пытаетесь сохранить результат на int. Попробуйте это:

float result = 300/(float)2; 
float result = 300/(float)1.25; 

Или для более краткости (f является сигналом для компилятора, что это постоянная float):

float result = 300/2f; 
float result = 300/1.25f; 

Обратите внимание, что float очень отличается от decimal, и оба имеют свои преимущества. Для того, чтобы использовать десятичную:

decimal result = decimal.Divide(300, 1.25); 

Или это (m является сигналом для компилятора, что это константа decimal):

decimal result = decimal.Divide(300m, 1.25m); 
+1

Обратите внимание, что он делает с '(float)' - это литье одного из операндов в float, так что используемый оператор деления является плавающей точкой. – AaronLS

+2

Вы также можете написать его 'var result = 300/2f' или с двойным' var result = 300/2d' или 'var result = 300/2.0' – Marco

+0

Может ли кто-нибудь объяснить мне, что означают« f »и« m » в уравнениях? – Pacobart

0

int может хранить только целые числа. Когда вы делите целое число на десятичное число, результат будет десятичным (даже если вы используете 4.00 из-за того, что хранятся плавающие точки).

Это не будет компилировать

int Num1 = 300/((float)1.25); 

Даже если вы литье явное поплавок (в противном случае 1,25 бы double), вы пытаетесь сохранить его в переменной типа int. Компилятор не будет делать это автоматически, потому что implicit conversion doesn't exist для него будет отличать float как int для вас. Таким образом, вам необходимо либо указать компилятору, что вы не против потери точности и бросить его в качестве ИНТ

int Num1 = (int)(300/((float)1.25)); 

Или вы можете изменить тип Num1 быть поплавок.

float Num1 = 300/((float)1.25); 
2

Проще говоря:

  • Если вы делаете arithmatic операцию (как +, -, *, /) на два номера различного типа, компилятор преобразует "наименьший" тип в «самый большой» тип, который может содержать большую часть информации. Итак, если вы разделите 300 (int) на 1.25 (double), компилятор преобразует 300 в double и разделит оба удвоения. Получаемый тип будет одного типа, так что: double.
  • Если вы хотите поместить результат «большего» типа в «меньший» тип (тип, который может содержать меньше информации, например, фракции), вы должны преобразовать этот тип в меньший тип с помощью явного приведения , Итак, если вы хотите поместить double в int, вы должны передать его в int, что приведет к возможной потере информации.
  • C# знает много суффиксов, которые можно использовать на постоянные числа, прямо указать, какой тип это число:
    • 10U ==> UINT
    • 10L ==> длинный
    • 10F ==> поплавок
    • 10D ==> double
    • 10M ==> десятичный.
Смежные вопросы