2014-04-24 1 views
0

그래서 나는 꽤 까다로운 질문을 가지고 있습니다. float로 평균을 선언했지만, 0을 배열의 0보다 큰 수인 avg = sum/counter;을 계산 한 다음 인쇄 할 때, 소수점 뒤에 0이옵니다.배열의 평균은 부동 소수점 형으로 캐스팅 된 경우에만 올바르게 표시됩니다.

그러나 float로 캐스팅하여 계산 한 경우 avg = (float) sum/counter;이면 평균이 올바르게 인쇄됩니다.

첫 번째 문자가 정확하지 않아야합니까? 변수를 부동 소수점으로 선언하면 왜 나중에 변수를 부동 소수점 형으로 다시 캐스팅해야합니까?

+3

'합계'는 어떤 유형입니까? –

+1

코드를 보여주십시오. 당신이 뭔가 잘못하고 있지만, 우리가 그것을 볼 수 없다면 당신이 잘못하고있는 것을 어떻게 알 수 있습니까? – gnasher729

답변

4

다음 sum/counter는 정수 값의 결과는 정수의 나눗셈을 수행한다. 그 결과를 변수 float에 할당 할 수 있지만 값은 정수 부분 만 남습니다.

는이 문제를 해결하려면 floatsum 또는 counter 중 하나를 캐스팅 할 필요 - 단지 당신이 결과로도 float 값을 받고 : 같은

float result = (float) sum/counter; 

이 길함으로써, 같은 ((float) sum)/counter - 작성한 캐스트가 sum에 적용됨을 의미합니다.

3

작성한 캐스트는 sum이 아니라 avg이 아니므로 결과가 정수일 경우 정상적으로 나타납니다. 만약

int sum; 
int counter; 
... 

선언하면

0

문제는 합 그래서 자동 cast.So가 float

1

운영자로 결과를 캐스팅 float로서 합계를 선언하거나 수동으로 입력하거나 입력하지 않는 소수 point.It 후 공의로의 라운드 형 integer이다 / 두 정수에 적용하면 정수 나누기가 수행됩니다. 두 개의 부동 소수점 값에 적용된 연산자 /은 부동 소수점 나누기를 수행합니다. 하나의 값이 부동 소수점이면 다른 하나는 부동 소수점으로 승격됩니다. 그러나 둘 다 정수이면 정수 나누기가 수행됩니다.

나중에 메모리에 이미 존재하는이 조작의 결과가 다른 변수에 지정됩니다. 그러나 그것은 또 다른 이야기입니다. 첫 번째로 정확한 결과를 얻고이를 저장할 변수에 할당 할 수 있습니다.

관련 문제