2011-01-25 69 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; 

評估爲13.0f/24這導致0.541667f(浮點除法)。

在組合的計算,則僅與整數處理(而不轉換至之間漂浮在),所以

(h + (m/60))/24 

評估爲13/24其等於0(整數除法)。將其更改爲

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

並且您將得到與上面相同的結果。

0

在你行

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

計算在int進行,而不是在float。請注意,在C(並因此在Objective-C)首先執行上的=右側的方程,而無需關心任何左手邊的類型(在這種情況下,float。)

使用

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

改爲。

+2

這不會產生相同的結果在上面的計算,因爲原來的海報使用`米/ 60`那裏,太(情願或不小心,我不知道)。爲了模擬第一次計算,使用`(h +(m/60))/ 24.0`。 – 2011-01-25 13:24:28

0

hourStep5的整個計算將被視爲整數。

嘗試h和米澆鑄成在該行的浮:

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