2011-01-25 10 views
0

このコードを、具体的にはhourStep計算で確認してください。目的関数-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(したがって、Objective-Cでは)に=の右側の式は左側のタイプ全く気にせず、最初に実行されることに注意してください(float、この場合。)

使用

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

代わりに

+2

又は偶然、私は知らない)。最初の計算を模倣するには、 '(h +(m/60))/ 24.0'を使います。 –

+0

いいところ、オレ! – Dave

+0

誤って - ゆずとオレに感謝します。もう一度間違えることはありません! –

0

hourStep5の計算全体が整数として扱われます。

は、その行のフロートにHおよびmの両方をキャストしてみてください。喜ん(すぎ、元のポスターは `がM /を60`使用するので、これは上記の計算と同様の結果が得られないであろう

float hourStep5 = (((float) h + ((float) m/60))/24) * 15; 
関連する問題