2014-04-09 1 views
0

로 반올림됩니다 내가 가지고있는 다음과 같은 값 :작은 수는 0

i->fitness = 160

sum_fitness = 826135

나는 작업을 수행합니다

i->roulette = (int)(((i->fitness/sum_fitness)*100000) + 0.5);

하지만 난에 0가 계속 i->roulette.

또한 double 변수에 i->fitness/sum_fitness을 저장하려고 시도한 다음 다른 작업을 적용하기 만하면 0이됩니다.

나는 160/826135이 그렇게 작은 숫자이므로 0으로 반올림한다고 생각합니다.

어떻게이 문제를 해결할 수 있습니까? 나는 결국 이런 짓을,

모두에게 감사 :

당신에게

편집 감사

double temp = (double)(i->fitness); 
i->roulette = (int)(((temp/sum_fitness)*100000) + 0.5); 

그리고 그것은했다.

모든 답변이 비슷하므로 하나를 선택하기가 어렵습니다.

+0

두 배로 g ___''(1956)''(1945673에서 잘린'int') – bolov

+1

'((double) (I-> fitness))/((double) sum_fitness))' –

답변

2

당신은 어떤 부동 소수점 연산이 잘린 이유

i->roulette = (int)(((i->fitness/sum_fitness)*100000) + 0.5); 

인 int로 값을 캐스팅 라인을 시도해보십시오.

i->roulette = (((i->fitness/sum_fitness)*100000) + 0.5); 

'sum_fitness'또는 'i- fitness'중 하나가 부동 소수점 나누기를 부동 소수점 나누기로 만들기위한 것입니다. 그렇지 않으면 나누기 전에이 중 하나를 캐스팅해야합니다.

i->roulette = (((i->fitness/(double)sum_fitness)*100000) + 0.5); 

당신은 어떤 정수 오버 플로우를하지 않는 한 작동합니다

i->roulette = (i->fitness *100000)/sum_fitness; 

처럼, 당신은 또한 분단과 곱셈의 순서를 변경하려고 할 수있는 정수 계산으로이를 확인하려면 이 경우 피트니스 위험이 2000000을 초과하는 경우에만 발생합니다.

+0

하지만 나는 그것을 곱한 후에 만 ​​'int'로 캐스팅합니다. '160/826135 * 100000 + 0.5 = 19.867' –

+0

피트 니스와 sum_fitness는 또한 부동 소수점 나누기를 만들기 위해 부동 소수점 유형이어야하며 그렇지 않은 경우 3/4가 0을 만드는 int division과 (3/4) * 100은 또한 3/4가 먼저 곱셈의()와 순서화로 인해 계산되기 때문에 0을 만듭니다. – Soren

2

나는 160/826135이 작은 숫자이므로 0으로 반올림한다고 생각합니다.

는 정수 나눗셈이며, 정수 부분을 절단 이다. 그래서 예, 0이지만 반올림은 없습니다. 99/1000이됩니다.

당신은 double에 분자 나 분모 캐스트를 같이 해결할 수 :

i->roulette = ((i->fitness/static_cast<double>(sum_fitness))*100000) + 0.5; 
+0

을 쓰면 어떨까요? 먼저 'double'로 캐스팅하고 그 다음에 만 나누세요. 저는 그것이 과제의 오른쪽에 있기 때문에 생각했습니다. 그리고 나서, 먼저 그것을 계산하고, 그 다음에 캐스트를합니다. –

+0

@AlaaM. 분자 또는 분모가'double'이면 결과는 double이됩니다. 따라서 부서 앞에서 주조하면 문제의 일부가 수정됩니다. 그러나 만약 여러분이 그 부분을'int'로 형변환한다면 여러분은 다시 절단을 얻습니다. – juanchopanza

+0

네, 궁극적으로 저는 그것을 '정수'가되기를 원하지만, 곱셈 후에 만하고 싶습니다. –