Похоже, вам нужно округленное число, которое по-прежнему является плавающим, но только до 3 знаков после запятой, а не только для целей отображения? Это то, что вы спрашиваете? Числа с плавающей запятой IEEE — настоящая боль. Вы можете назначить foo = 1.5, и тогда вы получите 1.499999999, и если вы затем скажете if ( foo == 1.5 )
, это не удастся. Просто мне это кажется ошибкой, но в сети есть длинные описания того, почему это «правильно». Мне кажется, что это верно в башне из слоновой кости и бесполезно в реальном мире.
Итак, некоторые возможности. Интересно, сработает ли умножение на 1000, а затем округление до целого значения и последующее деление на 1000... Конечно, та же плавающая ошибка IEEE, извините, spec все еще может вас укусить... стоит пытаться.
Мне стало любопытно, и я написал быстрый тест:
CGFloat foo = 0.124979;
NSLog(@"foo is: %f", foo );
NSInteger ifoo = ceil(foo * 1000.0);
foo = ifoo / 1000.0;
NSLog( @"ifoo is: %d, and back to foo is: %f", ifoo, foo );
выводит это (в любом случае в симуляторе):
test[5127:207] foo is: 0.124979
test[5127:207] ifoo is: 125, and back to foo is: 0.125000
так что это может делать то, что вы хотите.
удача.
person
Dad
schedule
11.07.2011