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
, теперь устарели.