Вопрос

Я сделал этот метод

+ (CGFloat) round: (CGFloat)f {
    int a = f;
    CGFloat b = a;
    return b;
}

Это работает, как ожидалось, но он только раунду. И если это отрицательное число, которое он все еще раундует.

Это был просто быстрый метод, который я сделал, не очень важно, чтобы он был правильно оборачиваться, я только что сделал его вокруг ценностей камеры X и Y для моей игры.

Этот метод хорошо? Это быстро? Или есть лучшее решение?

Это было полезно?

Решение

Уже есть стандартные функции с поведением, в котором вам может понадобиться <math.h> Такие как: floorf, ceilf, roundf, rintf а также nearbyintf (LASF F 'означает «FLOAT» версия, версии без него - «двойные» версии).

Лучше использовать стандартные методы не только потому, что они являются стандартными, но потому что они работают лучше в краевых случаях.

2013 Обновление (JessedC)

iOS больше не только 32 бит. Есть ряд других ответов на этот вопрос, который сейчас более актуален.

Большинство ответов упоминают импорт tgmath.h

Другие советы

2018 ответ

Другие ответы здесь либо датируются, либо не дают хороших примеров. Легко округлить CGFloat Использование встроенного SWIFT в rounded функция.

let x: CGFloat = 3.5
let y = x.rounded() // 4.0

Если вы хотите округлить значение на месте, вы можете использовать round:

var x: CGFloat = 3.5
x.round() // 4.0

Правила округления

Если вы хотите более точный контроль над тем, как цифры округляются, вы можете использовать FloatingPointRoundingRule.

От нуля

x.rounded(.awayFromZero)

Числа выше нуля закруглены, и цифры ниже нуля закруглены.

3.000  ->  3.0
3.001  ->  4.0
3.499  ->  4.0
3.500  ->  4.0
3.999  ->  4.0

-3.000  ->  -3.0
-3.001  ->  -4.0
-3.499  ->  -4.0
-3.500  ->  -4.0
-3.999  ->  -4.0

Вниз

x.rounded(.down)

Раунды любого числа с десятичным значением до следующего меньшего всего числа. Это так же, как floor(x).

3.000  ->  3.0
3.001  ->  3.0
3.499  ->  3.0
3.500  ->  3.0
3.999  ->  3.0

-3.000  ->  -3.0
-3.001  ->  -4.0
-3.499  ->  -4.0
-3.500  ->  -4.0
-3.999  ->  -4.0

До ближайшего или от нуля

x.rounded(.toNearestOrAwayFromZero)   // same as x.rounded()

Десятичные числа окружают до ближайшего целочисленного значения. Однако, когда значение точно в середине (как 3.5 или -3.5) Тогда положительные числа закруглены, а отрицательные числа округляются.

Это может иметь длинное сложное имя, но это нормально, как человек учится округление в школе. Это также правило, используемое, если вы просто делаете x.rounded().

3.000  ->  3.0
3.001  ->  3.0
3.499  ->  3.0
3.500  ->  4.0  ***
3.999  ->  4.0

-3.000  ->  -3.0
-3.001  ->  -3.0
-3.499  ->  -3.0
-3.500  ->  -4.0  ***
-3.999  ->  -4.0

К ближайшему или даже

x.rounded(.toNearestOrEven)

Это похоже на toNearestOrAwayFromZero, кроме сейчас .5 Значения оборуждаются до даже целого числа.

3.000  ->  3.0
3.001  ->  3.0
3.499  ->  3.0
3.500  ->  4.0   ***
3.999  ->  4.0
4.500  ->  4.0   ***

-3.000  ->  -3.0
-3.001  ->  -3.0
-3.499  ->  -3.0
-3.500  ->  -4.0   ***
-3.999  ->  -4.0
-4.500  ->  -4.0   ***

К нулю

x.rounded(.towardZero)

Это просто влияет на сокращение любых десятичных значений. Если вам нужен Int Вы могли бы сделать то же самое с Int(x).

3.000  ->  3.0
3.001  ->  3.0
3.499  ->  3.0
3.500  ->  3.0
3.999  ->  3.0

-3.000  ->  -3.0
-3.001  ->  -3.0
-3.499  ->  -3.0
-3.500  ->  -3.0
-3.999  ->  -3.0

Вверх

x.rounded(.up)

Это противоположность .down. Отказ Все десятичные числа окружены. Это так же, как ceil(x).

3.000  ->  3.0
3.001  ->  4.0
3.499  ->  4.0
3.500  ->  4.0
3.999  ->  4.0

-3.000  ->  -3.0
-3.001  ->  -3.0
-3.499  ->  -3.0
-3.500  ->  -3.0
-3.999  ->  -3.0

Примечания

  • Не забудьте во внимание негативные значения.
  • Результат round а также rounded все еще CGFloat. Отказ Если вам нужен Int Вы должны преобразовать это как Int(myCGFloat).
  • Нет необходимости использовать функции C математики round(x), ceil(x) а также floor(x) больше. Однако, если вы используете их, они обрабатывают как 64 и 32-битная архитектура, поэтому любые ответы, которые вы, возможно, видели с roundf, ceilf а также floorf сейчас устарели.

А. CGFloat Typedef'D или double или а float, Так что вы можете округлить их как любой другой реальный тип:

CGFloat round(CGFloat aFloat)
{
    return (int)(aFloat + 0.5);
}

Обратите внимание, что, хотя это работает с плавающими, достаточно маленькими, чтобы нести фракцию, она может действовать странно на больших значениях.

Пытаться #import "tgmath.h".

То <tgmath.h> Заголовок будет включать заголовки <math.h> а также <complex.h> И будет определять несколько типовых генерических макросов.

Вы изобретаете колесо - и это вопрос C, не является объективным C. Просто используйте стандартную функцию C Rounl ().

Для работы с 32 и 64 битом вы можете создать свой собственный макрос

#ifndef CGFLOAT_CEIL
    #ifdef CGFLOAT_IS_DOUBLE
        #define CGFLOAT_CEIL(value) ceil(value)
    #else
        #define CGFLOAT_CEIL(value) ceilf(value)
    #endif
#endif

PS Это не ответ на вопрос, но дополнение к вопросу о том, как работать с 32/64 битными значениями.

Определите это в файле, как mymacros.h, а чем добавить импорт в myapp-prefix.pch

Также помните, что выбирая CGFloat в качестве префикса для вашей функции может быть риском, поскольку Apple может добавить макрос, подобный этому этому, поэтому именно поэтому #ifndef cgfloat_ceil

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top