0

このコード、より具体的には hourStep の計算を確認してください。

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

正しい答えを得るために計算をさまざまなステップに分解しましたが、hourStep4 が生成するものを hourStep5 が生成しない理由を誰か説明できますか?

4

3 に答える 3

2

整数除算と浮動小数点除算の違いです。

この行:

float hourStep3 = hourStep2 / 24;

(浮動小数点除算) の13.0f / 24結果を評価します。0.541667f

組み合わせた計算では、整数のみを処理しているため (間に浮動小数点数に変換することはありません)、

(h + (m / 60)) / 24

13 / 24等しいと評価され0ます (整数除算)。に変更します

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

上記と同じ結果が得られます。

于 2011-01-25T13:22:43.980 に答える
0

あなたのラインで

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

計算はintではなく で実行されfloatます。=C (したがって、Objective-C) では、左辺の型 (この場合はfloat.)をまったく気にせずに、 の右辺の方程式が最初に実行されることに注意してください。

使用する

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

代わりは。

于 2011-01-25T13:21:56.300 に答える
0

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

その行で h と m の両方を float にキャストしてみてください。

float hourStep5 = (( (float) h + ( (float) m / 60)) / 24) * 15; 
于 2011-01-25T13:24:00.250 に答える