вычисления в target-c не возвращают правильное значение - PullRequest
0 голосов
/ 25 января 2011

Пожалуйста, ознакомьтесь с этим фрагментом кода, а точнее с вычислениями 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 ]

2 голосов
/ 25 января 2011

Это разница между целочисленным делением и делением с плавающей точкой.

Эта строка:

float hourStep3 = hourStep2 / 24;

оценивается как 13.0f / 24, что приводит к 0.541667f (деление с плавающей запятой).

В комбинированном расчете вы имеете дело только с целыми числами (без преобразования между числами с плавающей точкой), поэтому

(h + (m / 60)) / 24

оценивается как 13 / 24, что равно 0 (целочисленное деление). Измените его на

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

и вы получите тот же результат, что и выше.

0 голосов
/ 25 января 2011

Весь расчет hourStep5 будет рассматриваться как целое число.

Попробуйте привести h и m к числу с плавающей точкой в ​​этой строке:

float hourStep5 = (( (float) h + ( (float) m / 60)) / 24) * 15; 
0 голосов
/ 25 января 2011

В вашей строке

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

Расчет выполняется в int, а не в float.Обратите внимание, что в C (и, следовательно, в Objective-C) сначала выполняется уравнение в правой части =, без учета типа левой части (в данном случае float.)

Вместо этого используйте

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

.

...