Неверный результат при делении целого числа на число с плавающей точкой - PullRequest
2 голосов
/ 10 февраля 2012

Я работаю над Objective C и пытаюсь вывести правильный индекс массива из двух измерений.

Для этого у меня есть несколько кнопок, на которых установлен тег, объединяющий два индекса водин номер.Например, позиция 1,1 в массиве приводит к тегу = 11.

После этого, чтобы объединить два компонента индекса, я использую следующий код:

float tag = (float)[sender tag];

    float x = [[NSString stringWithFormat:@"%.2f", tag / 10.f] floatValue];
    //float x = (float)tag / 10.f;

    int y = floor (x);

    int z = (x - y) * 10;

Теория работает отлично, но я удивляюсь, когда получаю следующие результаты:

tag = 23 x = 2,29999995 вместо ожидаемого результата 2,3 (23/10 = 2,3, а не 2,2999995)!

Я тоже пытался с двойной и несколькими операциями без успеха.

Кто-нибудь знает, что я делаю неправильно?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 февраля 2012

Использовать целочисленную арифметику. Плавающая точка не представляет все числа с полной точностью, особенно нецелые значения.

Пример, где [sender tag] равно 23:

int senderTag = 23;
int tagA = senderTag / 10;
int tagB = senderTag % 10;
NSLog(@"senderTag: %d, tagA: %d, tagB: %d", senderTag, tagA, tagB);

Вывод NSLog:

senderTag: 23, tagA: 2, tagB: 3

0 голосов
/ 10 февраля 2012

В частности, дроби типа 1/3, 1/5 не могут быть правильно представлены арифметикой с плавающей запятой.

...