#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. Хорошо для точности. Я стремился к простоте, но я отредактирую свой ответ.