Estou tentando fazer uma calculadora da taxa de crescimento ( Double
) que arredondará o resultado para o número inteiro mais próximo e recalculará a partir daí, da seguinte forma:
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
}
mas eu tenho sido incapaz até agora.
EDIT Eu meio que fiz assim:
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
}
Embora eu não me importe que esteja sempre arredondando para baixo, eu não gosto disso porque firstUsers
teve que se tornar uma variável e mudar ao longo do programa (para fazer o próximo cálculo), o que eu não quero que aconteça.
pow()
, infelizmente, não disponível em um playgroundpow()
é definido na biblioteca do Darwin, então você precisaimport Darwin
primeiro (ouimport Foundation
ouimport Cocoa
ouimport UIKit
, todos os quais acabam importando o Darwin internamente).lround()
que retorna umInt
.round()
sempre arredonda para cima quando a casa decimal é> = 0,5 e para baixo quando é <0,5 (arredondamento padrão)." Exceto quando não.round(-16.5)
retorna -17, não -16. Isso é um inseto?Para arredondar um dobro para o número inteiro mais próximo, basta usar
round()
.Se você não deseja modificar o valor original, use
rounded()
:Como se poderia esperar ( ou não ), um número como
3.5
é arredondado para cima e um número como-3.5
é arredondado para baixo. Se você precisar de um comportamento de arredondamento diferente do que isso, poderá usar uma das regras de arredondamento . Por exemplo:Se você precisar de um real
Int
, basta convertê-lo em um (mas apenas se tiver certeza de que o dobro não será maior queInt.max
):Notas
round
,lround
,floor
, eceil
. No entanto, agora que o Swift tem essa funcionalidade incorporada, não posso mais recomendar o uso dessas funções. Agradeço a @dfri por me indicar isso. Confira a excelente resposta da @ dfri aqui . Também fiz algo semelhante ao arredondar aCGFloat
.fonte
Swift 3 e 4 - fazendo uso do
rounded(_:)
método conforme o modelo doFloatingPoint
protocoloO
FloatingPoint
protocolo (com o qual, por exemplo,Double
e emFloat
conformidade) define orounded(_:)
métodoOnde
FloatingPointRoundingRule
é uma enum enumerando várias regras de arredondamento diferentes:Utilizamos exemplos semelhantes aos da excelente resposta do @ Suragch para mostrar essas diferentes opções de arredondamento na prática.
.awayFromZero
Arredonde para o valor mais próximo permitido, cuja magnitude é maior ou igual à da fonte; não há equivalente direto entre as funções C, pois isso usa condicionalmente o sinal de
self
,ceil
oufloor
, para valores positivos e negativos deself
, respectivamente..down
Equivalente à
floor
função C..toNearestOrAwayFromZero
Equivalente à
round
função C.Essa regra de arredondamento também pode ser acessada usando o
rounded()
método de argumento zero ..toNearestOrEven
Arredonde para o valor permitido mais próximo; se dois valores são igualmente próximos, o mesmo é escolhido; equivalente à função C
rint
(/ muito semelhante anearbyint
)..towardZero
Equivalente à
trunc
função C.Se o propósito do arredondamento é para se preparar para o trabalho com um inteiro (por exemplo, usando
Int
pelaFloatPoint
inicialização após o arredondamento), poderíamos simplesmente fazer uso do fato de que, quando inicializar umInt
usando umDouble
(ouFloat
etc), a parte decimal será truncado distância..up
Equivalente à
ceil
função C.Adendo: visitando o código-fonte para
FloatingPoint
verificar a equivalência das funções C às diferentesFloatingPointRoundingRule
regrasSe quisermos, podemos dar uma olhada no código fonte do
FloatingPoint
protocolo para ver diretamente a função C equivalente àsFloatingPointRoundingRule
regras públicas .Em swift / stdlib / public / core / FloatingPoint.swift.gyb , vemos que a implementação padrão do
rounded(_:)
método nos faz usar o método mutatinground(_:)
:Em swift / stdlib / public / core / FloatingPointTypes.swift.gyb , encontramos a implementação padrão de
round(_:)
, na qual a equivalência entre asFloatingPointRoundingRule
regras e as funções de arredondamento C é aparente:fonte
fonte
Swift 3: Se você deseja arredondar para um determinado número de dígito, por exemplo, 5.678434 -> 5.68, basta combinar a função round () ou roundf () com uma multiplicação:
fonte
Você também pode estender o FloatingPoint no Swift 3 da seguinte maneira:
fonte
Self
significa?Swift 3
fonte
myNum.rounded()
não mudamyNum
, mas mudamyNum.round()
.Você também pode verificar se o dobro é maior que o valor máximo de Int antes de tentar converter o valor em um Int.
fonte
Uma solução muito fácil funcionou para mim:
número contém o valor 2
fonte