2013-02-22 3 views
0

정수에 대해 일부 산술 연산을 수행하려고합니다. 문제는 내가 두 배의 결과를 얻으려고 분열을하려고 할 때 결과가 항상 0.00000000000000000000입니다. ((7 * 207)/6790과 같이) 분명히 사실이 아니더라도. 수식을 형 변환하려고 시도했지만 여전히 동일한 결과를 얻습니다.C에서 정수 나누기 값을 내림/결과 0으로

내가 뭘 잘못하고 어떻게 해결할 수 있습니까?

int o12 = 7, o21 = 207, numTokens = 6790; 
double e11 = ((o12 * o21)/numTokens); 
printf(".%20lf", e11); // prints 0.00000000000000000000 
+0

이 코드를 실행하는 실제 예를 제공 할 수 있습니까? 입력은 무엇입니까? – Andrej

답변

3

관계없이 실제 값, 다음 원하는 분야

int/int = int 

출력은 자동적으로 비 int 형식으로 캐스팅되지 않는다.

따라서 출력 할 때 나눗셈을 수행 할 때 int으로 출력됩니다.

은 당신이하고 싶은 일이 이들의 힘이다 :

double/int = double 
float/int = float 
int/double = double 
int/float = float 

위는 자동 widening conversion 포함 - 단 하나의 부동 소수점 값이 될 필요가 있습니다.

다음 중 한 가지 방법으로이 작업을 수행 할 수 있습니다

: double 또는 float에 변수 중 하나 이상을 변경하면 해당하는 유형으로 캐스팅하여 값 중 하나

  • 전에 (double) 또는 (float) 퍼팅

    (double)(int/int)과 같은 캐스트는 처음에는 정수 나누기를 수행하므로 작동하지 않습니다 (이 경우을 반환 함)을 입력하면 값이 바닥에 표시됩니다. 결과를 double으로 캐스팅합니다 (캐스팅하지 않고 double에 할당하려는 것과 같습니다).

  • 0

    당신이 단순히 그것을 나눌 때, C가 정수를 가정하고 그래서 제로가되기 때문에

    double val = double(7*207)/double(6790); 
    

    시도 ((7 * 207)/6790)를 분할하는 경우!

    +0

    이것은 여전히 ​​정수로 나뉘며 결과 만'double'으로 형변환됩니다. – Archie

    +0

    @Archie OK, 힌트를 보내 주셔서 감사합니다. 게시물을 수정했습니다. –

    +0

    @ bash.d 캐스팅의 형태는 C++에서만 가능합니다. –

    1

    과 같은 식의 경우 결과는 0 또는 이라고 생각하면 double이라고 생각하면 틀림 없습니다.

    표현식에는 정수만 포함되어 있으므로 정수 곱하기와 정수 나누기로 계산됩니다.

    변경하려면 부동 소수점 유형으로 변환해야합니다. ((7 * 207)/6790.0).

    많은 사람들이 과제의 오른쪽이 대상 변수의 유형에 따라 자동으로 "조정"될 것으로 예상되는 것으로 보입니다. 이것이 작동하는 방식이 아닙니다. 결과 인은 변환되지만 오른쪽 표현식의 "내부"연산에는 영향을주지 않습니다. 당신의 코드에서 : 그 표현은 정수로 평가되도록

    e11 = ((o12 * o21)/numTokens); 
    

    o12, o21numTokens 모두는, 정수, 다음 e11 이후 부동 소수점으로 변환 double입니다. 표현은, 첫번째을 평가 한 후 그 결과 (정수 0는) 두 번 저장하는 변환되어이 같은 문제의 단지 간단한 경우가

    const double a_quarter = 1/4; 
    

    을하고 같은

    이. 이것이 언어가 작동하는 방식입니다.

    e11 = ((o12 * o21)/(double) numTokens); 
    
    +0

    알겠습니다. 고맙습니다! 나는 틀린 장소에서 이전에 캐스팅했다. – user2052561

    0

    당신은 분열하기 전에 double에이 숫자를 캐스팅해야합니다

    수정 캐스팅하는 것입니다. int에서 나누기를 수행하면 결과도 0으로 반올림 된 정수가됩니다 (예 : 1/2 == 0이지만, 1.0/2.0 == 0.5.

    0

    피연산자가 정수인 경우 C는 정수 산술 연산을 수행합니다. 즉, 1/4 == 0입니다. 그러나 피연산자를 double으로 설정하면 산술 연산에 소수 부분이 반영됩니다.그래서 :

    int a = 1; 
    int b = 4; 
    double c = 1.0 
    
    double d = a/b;   // d == 0.0 
    double e = c/b;   // e == 0.25 
    double f = (double)a/b; // f == 0.25