2011-01-25 9 views
0

이 코드 조각, 특히 hourStep 계산을 확인하십시오.objective-c의 계산이 올바른 값을 반환하지 않음

int h = [[timeArray objectAtIndex:0] intValue]; 
int m = [[timeArray objectAtIndex:1] intValue]; 
int s = [[timeArray objectAtIndex:2] intValue]; 
int mm = [[timeArray objectAtIndex:3] intValue]; 

NSLog([NSString stringWithFormat:@"time h:%d, m:%d, s:%d, mm:%d", h, m, s, mm]); 
//time h:13, m:7, s:55, mm:105 

float hourStep1 = m/60; 
float hourStep2 = h + hourStep1; 
float hourStep3 = hourStep2/24; 
float hourStep4 = hourStep3 * 15; 

int hour1 = ceil(hourStep4); 

NSLog([NSString stringWithFormat:@"hourStep1: %f, hourStep2: %f, hourStep3: %f, hourStep4: %f result: %d", hourStep1, hourStep2, hourStep3, hourStep4, hour1]); 
//hourStep1: 0.000000, hourStep2: 13.000000, hourStep3: 0.541667, hourStep4: 8.125000 result: 9 

float hourStep5 = ((h + (m/60))/24) * 15; 
NSLog([NSString stringWithFormat:@"hourStep5: %f", hourStep5]); 

//hourStep5: 0.000000 

나는 정답을 얻기 위해 여러 단계로 계산 세분화했지만 hourStep5이 hourStep4가 생성하는 것을 생산하지 않는 사람이 왜 설명 할 수 있습니까? 당신의 라인에서

답변

2

정수 나누기와 부동 소수점 나누기의 차이점은 다음과 같습니다.

이 라인 :

float hourStep3 = hourStep2/24; 

0.541667f (부동 소수점 나눗셈) 13.0f/24 결과로 평가. 결합 계산

, 만 (사이에 부유하는 변환없이) 정수 다루고, 그래서

(h + (m/60))/24 

0 (정수 나눗셈)을 동일 13/24 평가.

(h + (m/60))/24.0f 

으로 변경하면 위와 같은 결과가 나타납니다.

0

float hourStep5 = ((h + (m/60))/24) * 15; 

계산은하지 float에, int에서 수행된다. =의 오른쪽에있는 식 좌측의 유형이든지 배려없이 제 행한다 (오브젝티브 C에 따라서 등) C에 해당 주 (이 경우 float한다.)

사용

float hourStep5 = ((h + (m/60.0))/24) * 15; 

대신.

+2

이 존재 60'/상기 연산과 동일한 결과를 생성하지 않을 것이다 (부담 또는 우연히, 나는 모른다). 첫 번째 계산을 모방하려면'(h + (m/60))/24.0'을 사용하십시오. –

+0

좋은 장소, 올레! 우연히 – Dave

+0

- 감사합니다. Yuji와 Ole. 다시 그 실수를하지 않을 것입니다! –

0

hourStep5의 전체 계산은 정수로 처리됩니다.

그 라인 수레으로 H 및 m 모두 캐스팅보십시오도 원래 포스터 'm을 사용하므로

float hourStep5 = (((float) h + ((float) m/60))/24) * 15; 
관련 문제