Я пытаюсь сделать калькулятор скорости роста ( Double
), который округлит результат до ближайшего целого числа и пересчитает оттуда, как так:
let firstUsers = 10.0
let growth = 0.1
var users = firstUsers
var week = 0
while users < 14 {
println("week \(week) has \(users) users")
users += users * growth
week += 1
}
но я пока не могу.
РЕДАКТИРОВАТЬ Я вроде сделал это так:
var firstUsers = 10.0
let growth = 0.1
var users:Int = Int(firstUsers)
var week = 0
while users <= 14 {
println("week \(week) has \(users) users")
firstUsers += firstUsers * growth
users = Int(firstUsers)
week += 1
}
Хотя я не против того, чтобы оно всегда округлялось, мне это не нравится, потому что он firstUsers
должен был стать переменной и изменить ее во всей программе (чтобы сделать следующий расчет), чего я не хочу, чтобы это произошло.
pow()
к сожалению, не доступны на детской площадкеpow()
определен в библиотеке Дарвина, поэтому вам нужноimport Darwin
сначала (илиimport Foundation
или,import Cocoa
илиimport UIKit
все, что в конечном итоге приведет к внутреннему импорту Дарвина).lround()
который возвращаетInt
.round()
msgstr " всегда округляется, когда десятичный разряд равен> = .5, и уменьшается, когда он <.5 (стандартное округление)." За исключением случаев, когда это не так.round(-16.5)
возвращает -17, а не -16. Это ошибка?Чтобы округлить двойное число до ближайшего целого, просто используйте
round()
.Если вы не хотите изменять исходное значение, используйте
rounded()
:Как и следовало ожидать ( или нет ), число вроде
3.5
округляется вверх, а число-3.5
округляется вниз. Если вам нужно другое поведение округления, чем это, вы можете использовать одно из правил округления . Например:Если вам нужно фактическое значение,
Int
просто приведите его к одному (но только если вы уверены, что Double не будет большеInt.max
):Ноты
round
,lround
,floor
иceil
. Однако теперь, когда в Swift встроены эти функции, я больше не могу рекомендовать использовать эти функции. Спасибо @dfri за указание на это. Проверьте отличный ответ @ dfri здесь . Я также сделал нечто подобное для округленияCGFloat
.источник
Swift 3 и 4 - использование
rounded(_:)
метода, как указано вFloatingPoint
протоколеFloatingPoint
Протокол (например , к которомуDouble
иFloat
Соответствие нормам) чертежи вrounded(_:)
методГде
FloatingPointRoundingRule
перечисление, перечисляющее ряд различных правил округления:Мы используем примеры, схожие с примерами из превосходного ответа @ Suragch, чтобы продемонстрировать эти различные варианты округления на практике.
.awayFromZero
Округлить до ближайшего допустимого значения, величина которого больше или равна величине источника; нет прямого эквивалента среди функций C, так как это использует, условно на знаке
self
,ceil
илиfloor
, для положительных и отрицательных значенийself
, соответственно..down
Эквивалент
floor
функции C..toNearestOrAwayFromZero
Эквивалент
round
функции C.Это округление правило также можно получить с помощью нулевого аргумента
rounded()
метода ..toNearestOrEven
Округлить до ближайшего допустимого значения; если два значения одинаково близки, выбирается четное; эквивалентно функции C
rint
(/ очень похоже наnearbyint
)..towardZero
Эквивалент
trunc
функции C.Если цель закругления является подготовка к работе с целым числом (например , используя
Int
приFloatPoint
инициализации после округления), мы могли бы просто использовать тот факт , что при инициализации сInt
использованиемDouble
(илиFloat
т.п.), дробная часть будет усечена прочь..up
Эквивалент
ceil
функции C.Приложение: посещение исходного кода для
FloatingPoint
проверки эквивалентности функций C различнымFloatingPointRoundingRule
правилам.Если мы хотим, мы можем взглянуть на исходный код
FloatingPoint
протокола, чтобы напрямую увидеть эквиваленты функции C общедоступнымFloatingPointRoundingRule
правилам.Из swift / stdlib / public / core / FloatingPoint.swift.gyb мы видим, что реализация
rounded(_:)
метода по умолчанию делает насround(_:)
методом мутации :Из swift / stdlib / public / core / FloatingPointTypes.swift.gyb мы находим реализацию по умолчанию
round(_:)
, в которойFloatingPointRoundingRule
очевидна эквивалентность между правилами и функциями округления C:источник
источник
Swift 3: если вы хотите округлить до определенного числа, например, 5.678434 -> 5.68, вы можете просто объединить функцию round () или roundf () с умножением:
источник
Вы также можете расширить FloatingPoint в Swift 3 следующим образом:
источник
Self
значит?Свифт 3
источник
myNum.rounded()
не меняетсяmyNum
, ноmyNum.round()
меняется.Вы также можете проверить, больше ли значение double, чем максимальное значение Int, прежде чем пытаться преобразовать значение в Int.
источник
У меня сработало очень простое решение:
число содержит значение 2
источник