Decimal.Divide (int, int)는 작동하지만 (int / int)는 작동하지 않는 이유는 무엇입니까?


105

어떻게 두 개의 32 비트 정수를 (int / int)로 나누면 나에게 반환 0되지만, 내가 사용 Decimal.Divide()하면 정답을 얻을 수 있습니까? 나는 결코 ac # 사람이 아닙니다.


1
구체적인 예를 제공 할 수 있습니까? Decimal은 Int32와 다른 유형입니다.
Groo

그건 그렇고 Decimal.Divide 는 소수만 입력으로 사용합니다.
Ravi

Decimal.Divide는 정수에 대해서도 입력으로 작동합니다.
Thamarai T

답변:


214

int정수 유형입니다. 두 개의 int를 나누면 정수 나눗셈을 수행합니다 . 즉, 결과 유형에 저장할 수 없기 때문에 소수 부분이 잘립니다 ( int!). Decimal반대로에는 소수 부분이 있습니다. 를 호출 Decimal.Divide하면 int인수가 암시 적으로 Decimals 로 변환됩니다 .

int인수 중 하나 이상을 명시 적으로 부동 소수점 유형으로 캐스팅 하여 인수에 정수가 아닌 나누기를 적용 할 수 있습니다 . 예 :

int a = 42;
int b = 23;
double result = (double)a / b;

2
좋은 대답입니다. 또한 동일한 결과를 제공하는 Decimal.Divide (a, b)를 시도했습니다.
Baxter

6

첫 번째 경우에는 정수 나누기를 수행하므로 결과가 잘리고 (소수 부분이 잘림) 정수가 반환됩니다.

두 번째 경우에는 int가 먼저 소수로 변환되고 결과는 소수입니다. 따라서 그들은 잘리지 않고 올바른 결과를 얻습니다.


4

다음 줄 :

int a = 1, b = 2;
object result = a / b;

... 정수 산술을 사용하여 수행됩니다 . Decimal.Divide반면에 유형의 두 매개 변수를 사용 Decimal하므로 분할은 정수 값이 아닌 10 진수 값에서 수행됩니다. 이는 다음과 같습니다.

int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;

이를 조사하기 위해 위의 각 예제 뒤에 다음 코드 줄을 추가 할 수 있습니다.

Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());

첫 번째 경우의 출력은

0
System.Int32

.. 그리고 두 번째 경우 :

0,5
System.Decimal

2

Decimal.Divide(decimal, decimal)4/5가 정수 나눗셈으로 처리되고 0을 반환하는 10 진수 값 (정확한)을 반환하기 전에 2 개의 int 인수를 10 진수로 암시 적으로 변환한다고 생각 합니다.


1

숫자를 캐스팅하고 싶습니다.

더블 c = (더블) a / (더블) b;

참고 : C #의 인수 중 하나가 double이면 이중 나누기가 사용되어 이중이됩니다. 따라서 다음도 작동합니다.

더블 c = (더블) a / b;

여기에 소규모 프로그램이 있습니다.

static void Main(string[] args)
        {
            int a=0, b = 0, c = 0;
            int n = Convert.ToInt16(Console.ReadLine());
            string[] arr_temp = Console.ReadLine().Split(' ');
            int[] arr = Array.ConvertAll(arr_temp, Int32.Parse);
            foreach (int i in arr)
            {
                if (i > 0) a++;
                else if (i < 0) b++;
                else c++;
            }
            Console.WriteLine("{0}", (double)a / n);
            Console.WriteLine("{0}", (double)b / n);
            Console.WriteLine("{0}", (double)c / n);
            Console.ReadKey();
        }

0

0 <a <1 대답을 찾고 있다면 int / int는 충분하지 않습니다. int / int는 정수 나누기를 수행합니다. int 중 하나를 작업 내에서 double로 캐스팅 해보십시오.


1
Int32는 부호있는 정수입니다. 0 <answer <1?
Groo

0

제 경우에는 아무것도 작동하지 않았습니다.

제가하고 싶은 것은 278을 575로 나누고 100을 곱하여 백분율을 찾는 것입니다.

double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);

% : 48,3478260869565-> 278/575 ---> 0 % : 51,6521739130435-> 297/575 ---> 0

PeopleCount에 1.0을 곱하면 10 진수가되고 나눗셈은 48.34가됩니다. 또한 100이 아닌 100.0을 곱합니다.


-1

그렇게 표시된 대답은 거의 다 왔지만 double과 decimal을 사용하는 것에는 차이가 있다는 점을 덧붙일 가치가 있다고 생각합니다.

나는 위키 백과보다 개념을 더 잘 설명하지 않을 것이므로 포인터 만 제공 할 것이다.

부동 소수점 산술

10 진수 데이터 유형

금융 시스템에서는 특정 소수점 이하 자릿수 (10 진수) 정확도를 보장 할 수 있어야하는 경우가 종종 있습니다. 입력 / 소스 데이터가 10 진수 인 경우 일반적으로 불가능하지만 2 진수로 산술을 수행합니다 (숫자의 소수 확장에 필요한 소수 자릿수는 기본에 따라 다르기 때문에 1/3은 무한히 많은 소수를 사용합니다. 10 진수로 표현할 자리는 0.333333 ...이지만, 3 진수에서는 소수 하나만 사용합니다 : 0.1).

부동 소수점 숫자는 작업이 더 빠르며 (CPU 시간 측면에서, 프로그래밍 측면에서 똑같이 간단 함) 반올림 오류를 최소화하려는 경우 (과학 응용 프로그램에서와 같이) 선호됩니다.


1
응답의 어떠한 원래의 질문에 대답하는 역할을하지
LordWilmore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.