Как округлить двойной до ближайшего Int в swift?
Я пытаюсь сделать калькулятор темпов роста (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
}
но я был не в состоянии до сих пор.
EDIT
Я вроде как сделал это так:
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 должен был стать переменной и изменяться на протяжении всей программы (для того, чтобы сделать следующий расчет), который я не хочу, чтобы это произошло.
7 ответов:
есть
roundдоступныFoundationбиблиотека (это на самом деле вDarwin, аFoundationимпортDarwinи большую часть времени вы хотите использоватьFoundationвместоDarwinнапрямую).import Foundation users = round(users)запуск кода на игровой площадке, а затем вызов:
print(round(users))выходы:
15.0
round()всегда округляется, когда десятичное число>= .5и вниз, когда он< .5(стандартное округление). Вы можете использоватьfloor()для принудительного округления, иceil()для принудительного округления.Если вам нужно округлить до определенного места, затем умножить на
pow(10.0, number of places),round, а затем разделите наpow(10, number of places):округлить до 2 знаков после запятой:
let numberOfPlaces = 2.0 let multiplier = pow(10.0, numberOfPlaces) let num = 10.12345 let rounded = round(num * multiplier) / multiplier print(rounded)выходы:
10.12
Примечание: из-за того, как работает математика с плавающей запятой,
roundedне всегда быть совершенно точным. Лучше всего думать об этом больше как о приближении округления. Если вы делаете это для отображения, лучше использовать форматирование строк для форматирования числа, а не использовать математику для его округления.
чтобы округлить двойник до ближайшего целого числа, просто используйте
round().var x = 3.7 x.round() // x = 4.0если вы не хотите изменять исходное значение, то используйте
rounded():let x = 3.7 let y = x.rounded() // y = 4.0. x = 3.7как и следовало ожидать (а может и нет), а как
3.5округляется и число, как-3.5округляется вниз. Если вам нужно другое поведение округления, чем это, вы можете использовать один из правила округления. Для пример:var x = 3.7 x.round(.towardZero) // 3.0Если вам нужен фактический
Intтогда просто бросьте его в один:let myInt = Int(myDouble.rounded())Примечания
- этот ответ полностью переписан. Мой старый ответ касался математических функций C, таких как
round,lround,floorиceil. Однако теперь, когда Swift имеет эту встроенную функциональность, я больше не могу рекомендовать использовать эти функции. Спасибо @dfri за то, что указал мне на это. Проверьте @ dfri отличный ответ здесь. Я также сделал что-то подобное для округление aCGFloat.
Swift 3 & 4-Использование
rounded(_:)метод как blueprinted вFloatingPointпротоколThe
FloatingPointпротокол (к которым, например,DoubleиFloatсоответствует) чертежиrounded(_:)методfunc rounded(_ rule: FloatingPointRoundingRule) -> Selfздесь
FloatingPointRoundingRule- это перечисление, перечисляющее ряд различных правил округления:
case awayFromZeroкруглый к ближайшее допустимое значение, величина которого больше или равно как и у источника.
case downокруглить до ближайшего допустимого значения, которое меньше или равно источник.
case toNearestOrAwayFromZeroокруглить до ближайшего допустимого значения; если два значения одинаково близки, выбирается тот, который имеет большую величину.
case toNearestOrEvenокруглить до ближайшего допустимого значения; если два значения одинаково близки, даже один выбран.
case towardZeroокруглить до ближайшего допустимого значения, величина которого меньше или равно как и у источника.
case upокруглить до ближайшего допустимого значения, которое больше или равно источник.
мы используем аналогичные примеры те, что из отличный ответ @ Suragch показать эти различные варианты округления на практике.
.awayFromZeroокруглить до ближайшего допустимого значения, величина которого больше или равна величине источника; нет прямого эквивалента среди функций C, как это используется, условно по знаку
self,ceilилиfloor, для положительных и отрицательных значенийself, соответственно.3.000.rounded(.awayFromZero) // 3.0 3.001.rounded(.awayFromZero) // 4.0 3.999.rounded(.awayFromZero) // 4.0 (-3.000).rounded(.awayFromZero) // -3.0 (-3.001).rounded(.awayFromZero) // -4.0 (-3.999).rounded(.awayFromZero) // -4.0
.downэквивалентно C .
3.000.rounded(.up) // 3.0 3.001.rounded(.up) // 4.0 3.999.rounded(.up) // 4.0 (-3.000).rounded(.up) // 3.0 (-3.001).rounded(.up) // 3.0 (-3.999).rounded(.up) // 3.0
добавление: посещение исходного кода для
FloatingPointдля проверки эквивалентности функций C различнымFloatingPointRoundingRuleправилаесли мы хотим, мы можем взглянуть на исходный код
FloatingPointпротокол для прямого просмотра эквивалентов функции C для публикиFloatingPointRoundingRuleправила.от swift/stdlib/public/core / FloatingPoint.быстрый.гыбь мы видим, что реализация по умолчанию
rounded(_:)метод делает нас мутирующимиround(_:)способ:public func rounded(_ rule: FloatingPointRoundingRule) -> Self { var lhs = self lhs.round(rule) return lhs }с swift/stdlib/public/core / FloatingPointTypes.быстрый.гыбь мы находим реализацию по умолчанию
round(_:), в котором эквивалентность междуFloatingPointRoundingRuleправила и функции округления C очевидны:public mutating func round(_ rule: FloatingPointRoundingRule) { switch rule { case .toNearestOrAwayFromZero: _value = Builtin.int_round_FPIEEE${bits}(_value) case .toNearestOrEven: _value = Builtin.int_rint_FPIEEE${bits}(_value) case .towardZero: _value = Builtin.int_trunc_FPIEEE${bits}(_value) case .awayFromZero: if sign == .minus { _value = Builtin.int_floor_FPIEEE${bits}(_value) } else { _value = Builtin.int_ceil_FPIEEE${bits}(_value) } case .up: _value = Builtin.int_ceil_FPIEEE${bits}(_value) case .down: _value = Builtin.int_floor_FPIEEE${bits}(_value) } }
Swift 3: Если вы хотите округлить до определенного числа цифр, например, 5.678434 - > 5.68, вы можете просто объединить функцию round() или roundf () с умножением:
let value:Float = 5.678434 let roundedValue = roundf(value * 100) / 100 print(roundedValue) //5.68
вы также можете расширить FloatingPoint в Swift 3 следующим образом:
extension FloatingPoint { func rounded(to n: Int) -> Self { return (self / Self(n)).rounded() * Self(n) } } 324.0.rounded(to: 5) // 325
**In Swift** var a = 14.123456789 var b = 14.123456789 var c = 14.123456789 var d = 14.123456789 var e = 14.123456789 var f = 14.123456789 a.rounded(.up) //15 b.rounded(.down) //14 c.rounded(.awayFromZero) //15 d.rounded(.towardZero) //14 e.rounded(.toNearestOrAwayFromZero) //14 f.rounded(.toNearestOrEven) //14
Comments