Я написал приложение для iPhone и столкнулся с проблемой, связанной с типизацией между float и int. Я переписал код на C, и результаты всегда были одинаковыми, независимо от того, скомпилирован ли он под OS X (Console и Xcode), Linux (Console) или Windows (Visual Studio):
// Calculation of a page index depending on the amount of pages, its x-offset on the view
// and the total width of the view
#include <stdio.h>
int main()
{
int result = 0;
int pagesCnt = 23;
float offsetX = 2142.0f;
float width = 7038.0f;
offsetX = offsetX / width;
offsetX = (float)pagesCnt * offsetX;
result = (int)offsetX;
printf("%f (%d)\n", offsetX, result);
// The console should show "7.000000 (7)" now
// But actually I read "7.000000 (6)"
return 0;
}
Конечно, у нас потеря точности здесь. При выполнении математики с калькулятором x приводит к 7.00000000000008, а не только к 7.000000.
Тем не менее, насколько я понимаю C, это не должно быть проблемой, так как C предназначен для усечения позиций после точки числа с плавающей запятой при преобразовании его в целое число. В данном случае это то, чего я на самом деле хочу.
При использовании double вместо float результат будет таким, как ожидалось, но мне здесь не нужна двойная точность, и это не должно иметь никакого значения.
Я что-то здесь не так? Есть ли ситуации, когда мне следует избегать преобразования в int с помощью (int)? В любом случае, почему С уменьшает результат? Я должен всегда использовать double?
Большое спасибо!
Редактировать: Я что-то неправильно сформулировал: конечно, это имеет значение при использовании double вместо float. Я имел в виду, что это не должно иметь значения для (int) 7.000000f или 7.00000000000008.
Редактировать 2: Благодаря вам, теперь я понимаю мою ошибку. Использование printf () без определения точности с плавающей точкой было неправильным. (int) от 6.99 ... до 6, конечно, правильно. Поэтому я буду использовать double в будущем, когда буду сталкиваться с такими проблемами.