2012-06-03 2 views
-4

По некоторым причинам мне нужно целое число и часть фракции двойного значения как два отдельных целых числа.Базовая математика в Objective C на iPhone/iOS

Для примера: значение 12,34 расщепляется в Целые 12 и 34.

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

double aValue = 2.4f; 
int aInt = (int)aValue;  
int aFract = (int)((aValue - aInt) * 100.0f); 

Он работает до сих пор, но имеет странное поведение вывода.

Например, передача 2.30000 результатов в '2' и '29' вместо '2' и '30'.

Если я объявляю aInt и aFract как Double, результат обработки корректно отображается в «2.0000» и «30 .0000», но преобразование «30 .0000» в целое число снова «интересно» в «29».

+7

[Что вы должны знать о плавающей точкой.] (http://docs.oracle.com/cd/ E19957-01/806-3568/ncg_goldberg.html) Этот вопрос является Также повторяется сотни раз. –

ответ

-2

Вы сталкиваетесь с неточностями с представлением числа. Добавьте 0,125 или около того до усечения.

+0

Спасибо Игнасио. Этот подход работает до сих пор, но я до сих пор не доволен этим, так как не понимаю, почему 0.30 * 100.0 приведет к неточностям. Некоторые ошибки округления при таких числах, как 13.6546846516513512651 Я бы ожидал в любом случае. Но не при умножении «100» и «0,3». – Tom

+0

@ Тома, почему бы и нет? Это базовые 10 номеров, а компьютер работает в базе 2. –

+0

Вы правы Карл. Может быть, я должен использовать NSDecimal для таких вычислений. Я знаю, что компьютер работает на базе 2, но до сих пор я предполагал, что Float и Double уже будут обрабатывать проблему с базой 10/2 по умолчанию. Спасибо вам, ребята. – Tom

1

Если вы собираетесь конвертировать некоторые (небольшое число меньше, чем 100 или около того), а не внутри цикла, то преобразования в строку будет более точным, вы не попадете в неточности

было бы что-то подобное

double aValue = 2.3; 
NSString *str = [NSString stringWithFormat:@"%f", aValue]; 
NSArray *arr = [str componentsSeparatedByString:@"."]; 

Сейчас аранжировка содержит 2 и 3 пожалуйста, помните, что хороший программист ленивый программист

+3

Это все забава и игры, пока он не содержит '2999999999999'. –

+0

Спасибо, Омар. Я уже рассматривал это решение. Это будет работать, но не поместится в моем случае. На мой взгляд, iOS должна делать математику, как ожидалось. И 0,30 * 100,0 равно 30,0 и ничего больше. – Tom

+2

Но 0,30 [не может быть представлено точно как двоичное число] (http://www.wolframalpha.com/input/?i=0.3+in+binary). Как вы предлагаете компьютер хранить этот номер? –

Смежные вопросы