objective-c中的计算未返回正确的值

时间:2011-01-25 13:15:12

标签: objective-c ios floor ceil

请查看这段代码,更具体地说是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

我已将计算分解为各个步骤以获得正确的答案,但有人可以解释为什么hourStep5不会产生hourStep4产生的内容吗?

3 个答案:

答案 0 :(得分:2)

这是整数除法和浮点除法之间的区别。

这一行:

float hourStep3 = hourStep2 / 24;

评估为13.0f / 24,结果为0.541667f(浮点除法)。

在组合计算中,您只处理整数(不转换为中间的浮点数),所以

(h + (m / 60)) / 24

评估为13 / 24等于0(整数除法)。将其更改为

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

你会得到与上面相同的结果。

答案 1 :(得分:0)

在你的行

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

计算在int执行,而不在float执行。注意,在C中(因此在Objective-C中)首先执行=右侧的等式,而不关心左侧的类型(在这种情况下,float)。 )

使用

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

代替。

答案 2 :(得分:0)

hourStep5的整个计算将被视为整数。

尝试将h和m同时转换为该行中的浮点数:

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