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 firstUsers
tuvo 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 Darwin
en 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.5
se redondea hacia arriba y un número como-3.5
se 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 elFloatingPoint
protocoloEl
FloatingPoint
protocolo (al cual, por ejemplo,Double
y seFloat
ajusta) esboza elrounded(_:)
método¿Dónde
FloatingPointRoundingRule
hay 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.
.awayFromZero
Redondee 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
,ceil
ofloor
, para valores positivos y negativos deself
, respectivamente..down
Equivalente a la
floor
función C..toNearestOrAwayFromZero
Equivalente a la
round
función C.También se puede acceder a esta regla de redondeo utilizando el
rounded()
método de argumento cero ..toNearestOrEven
Redondear 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
)..towardZero
Equivalente a la
trunc
función C.Si el propósito del redondeo es prepararse para trabajar con un número entero (por ejemplo, usando
Int
porFloatPoint
inicialización después del redondeo), podríamos simplemente hacer uso del hecho de que al inicializar unInt
uso de aDouble
(oFloat
etc.), la parte decimal se truncará..up
Equivalente a la
ceil
función C.Anexo: visitando el código fuente para
FloatingPoint
verificar la equivalencia de las funciones C con los diferentesFloatingPointRoundingRule
reglasSi quisiéramos, podemos echar un vistazo al código fuente del
FloatingPoint
protocolo para ver directamente los equivalentes de la función C al públicoFloatingPointRoundingRule
reglas .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 lasFloatingPointRoundingRule
reglas 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
Self
significaSwift 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