Estoy tratando de hacer una calculadora de la tasa de crecimiento ( Double) que redondeará el resultado al número entero más cercano y volverá a calcular desde allí, como tal:
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
}
pero hasta ahora no he podido.
EDITAR Lo hice así:
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
}
Aunque no me importa que siempre se esté redondeando, no me gusta porque firstUserstuvo que convertirse en una variable y cambiar a lo largo del programa (para hacer el siguiente cálculo), lo que no quiero que suceda.

pow()desafortunadamente no está disponible en un patio de juegospow()se define en la biblioteca de Darwin, lo que es necesarioimport Darwinen primer lugar (oimport Foundation, oimport Cocoa, oimport UIKit, todo lo cual termina la importación de Darwin internamente).lround()que devuelve unInt.round()siempre se redondea hacia arriba cuando el decimal es> = .5 y hacia abajo cuando es <.5 (redondeo estándar)". Excepto cuando no lo hace.round(-16.5)devuelve -17, no -16. ¿Es esto un error?Para redondear un doble al entero más cercano, solo use
round().Si no desea modificar el valor original, use
rounded():Como cabría esperar ( o no ), un número como
3.5se redondea hacia arriba y un número como-3.5se redondea hacia abajo. Si necesita un comportamiento de redondeo diferente, puede usar una de las reglas de redondeo . Por ejemplo:Si necesita un real
Int, simplemente se lo emite a uno (pero solo si está seguro de que el Doble no será mayor queInt.max):Notas
round,lround,floor, yceil. Sin embargo, ahora que Swift tiene esta funcionalidad incorporada, ya no puedo recomendar el uso de esas funciones. Gracias a @dfri por señalarme esto. Mira la excelente respuesta de @ dfri aquí . También hice algo similar para redondear aCGFloat.fuente
Swift 3 y 4: haciendo uso del
rounded(_:)método como se muestra en elFloatingPointprotocoloEl
FloatingPointprotocolo (al cual, por ejemplo,Doubley seFloatajusta) esboza elrounded(_:)método¿Dónde
FloatingPointRoundingRulehay una enumeración que enumera una serie de reglas de redondeo diferentes:Utilizamos ejemplos similares a los de la excelente respuesta de @ Suragch para mostrar estas diferentes opciones de redondeo en la práctica.
.awayFromZeroRedondee al valor permitido más cercano cuya magnitud sea mayor o igual que la de la fuente; no hay equivalente directo entre las funciones de C, ya que esto utiliza, condicionalmente en el signo de
self,ceilofloor, para valores positivos y negativos deself, respectivamente..downEquivalente a la
floorfunción C..toNearestOrAwayFromZeroEquivalente a la
roundfunción C.También se puede acceder a esta regla de redondeo utilizando el
rounded()método de argumento cero ..toNearestOrEvenRedondear al valor permitido más cercano; si dos valores son igualmente cercanos, se elige el par; equivalente a la función C
rint(/ muy similar anearbyint)..towardZeroEquivalente a la
truncfunción C.Si el propósito del redondeo es prepararse para trabajar con un número entero (por ejemplo, usando
IntporFloatPointinicialización después del redondeo), podríamos simplemente hacer uso del hecho de que al inicializar unIntuso de aDouble(oFloatetc.), la parte decimal se truncará..upEquivalente a la
ceilfunción C.Anexo: visitando el código fuente para
FloatingPointverificar la equivalencia de las funciones C con los diferentesFloatingPointRoundingRulereglasSi quisiéramos, podemos echar un vistazo al código fuente del
FloatingPointprotocolo para ver directamente los equivalentes de la función C al públicoFloatingPointRoundingRulereglas .Desde swift / stdlib / public / core / FloatingPoint.swift.gyb , vemos que la implementación predeterminada del
rounded(_:)método nos convierte en elround(_:)método de mutación :En swift / stdlib / public / core / FloatingPointTypes.swift.gyb encontramos la implementación predeterminada de
round(_:), en la que la equivalencia entre lasFloatingPointRoundingRulereglas y las funciones de redondeo en C es evidente:fuente
fuente
Swift 3: si desea redondear a un cierto número de dígitos, por ejemplo 5.678434 -> 5.68, puede combinar la función round () o roundf () con una multiplicación:
fuente
También puede extender FloatingPoint en Swift 3 de la siguiente manera:
fuente
SelfsignificaSwift 3
fuente
myNum.rounded()no cambiamyNum, pero lomyNum.round()hace.También es posible que desee verificar si el doble es más alto que el valor máximo de Int antes de intentar convertir el valor en Int.
fuente
Una solución muy fácil funcionó para mí:
el número contiene el valor 2
fuente