Получить целочисленную часть числа с плавающей точкой: Objective-C

#objective-c #c

#objective-c #c

Вопрос:

Так что у меня есть

float x = x 0.25;

Это число с плавающей точкой будет вызываться каждый раз, когда происходит щелчок

NSLog(@»%f»,x);

Я хочу, чтобы nslog возвращал только целую числовую часть, например, так

   x        return        
 

  1.25         1
 1.50         1
 3.25         3
 4.75         4
 

Есть идеи?

Ответ №1:

Преобразование в int не будет работать, если число с плавающей запятой выходит за пределы диапазона int .

Печать с "%.0f" помощью не усекается, а округляется, поэтому 4.75 будет печатать как 5 .

Если ваш компилятор (точнее, ваша библиотека времени выполнения) поддерживает их, функции trunc() , truncf() , и truncl() , объявленные в <math.h> , делают именно то, что вы хотите:

 printf("%.0fn", trunc(x));
 

Эти функции являются новыми в C99, поэтому, возможно, ваш компилятор их не поддерживает. C90 действительно предоставляет floor() функцию; вы можете использовать ее, если вы напишете какой-нибудь специальный код для отрицательных чисел.

Ответ №2:

Вы можете рассматривать x как int (приведение):

 NSLog("%d", (int)x);
 

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

РЕДАКТИРОВАТЬ: пожалуйста, обратите внимание, что это небезопасный способ усечения всех возможных значений с плавающей запятой, хотя он будет отлично работать для небольших значений (тех, которые вписываются в int ).

Комментарии:

1. Но это приведет к сбою, если x находится за пределами диапазона INT_MIN .. INT_MAX .

2. Если вы предпочитаете, вы можете использовать long long или unsigned по мере необходимости, чтобы увеличить доступный диапазон.

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

4. Хорошо для точности. Я стремился к простоте, но я отредактирую свой ответ.