Próbuję zrobić kalkulator tempa wzrostu ( Double
), który zaokrągli wynik do najbliższej liczby całkowitej i ponownie obliczy od tego miejsca, jako taki:
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
}
ale jak dotąd nie mogłem.
EDYCJA Zrobiłem to tak:
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
}
Chociaż nie przeszkadza mi to, że zawsze zaokrągla się w dół, nie podoba mi się to, ponieważ firstUsers
musiałem stać się zmienną i zmieniać w całym programie (aby wykonać następne obliczenia), czego nie chcę, aby tak się stało.
pow()
niestety nie jest dostępny na placu zabawpow()
jest zdefiniowane w bibliotece Darwina, więc musiszimport Darwin
najpierw (lubimport Foundation
lubimport Cocoa
lubimport UIKit
, z których wszystkie kończą się wewnętrznym importem Darwina).lround()
który zwracaInt
.round()
zawsze zaokrągla w górę, gdy miejsce dziesiętne to> = 0,5, i w dół, gdy wynosi <0,5 (zaokrąglanie standardowe).” Chyba że tak nie jest.round(-16.5)
zwraca -17, a nie -16. Czy to błąd?Aby zaokrąglić podwójną do najbliższej liczby całkowitej, po prostu użyj
round()
.Jeśli nie chcesz modyfikować oryginalnej wartości, użyj
rounded()
:Jak można by się spodziewać ( lub nie ), liczba taka jak
3.5
jest zaokrąglana w górę, a liczba podobna-3.5
jest zaokrąglana w dół. Jeśli potrzebujesz innego sposobu zaokrąglania, możesz użyć jednej z reguł zaokrąglania . Na przykład:Jeśli potrzebujesz rzeczywistego,
Int
po prostu rzuć go na jeden (ale tylko wtedy, gdy masz pewność, że Double nie będzie większy niżInt.max
):Uwagi
round
,lround
,floor
, iceil
. Jednak teraz, gdy Swift ma wbudowaną tę funkcję, nie mogę już zalecać korzystania z tych funkcji. Dziękuję @dfri za wskazanie mi tego. Sprawdź doskonałą odpowiedź @ dfri tutaj . Zrobiłem też coś podobnego do zaokrąglaniaCGFloat
.źródło
Swift 3 i 4 - wykorzystując
rounded(_:)
metodę zgodnie ze schematem wFloatingPoint
protokoleFloatingPoint
Protokół (w którym npDouble
iFloat
Przylega) plany narounded(_:)
metodęGdzie
FloatingPointRoundingRule
jest wyliczenie wyliczające kilka różnych reguł zaokrąglania:Korzystamy z przykładów podobnych do tych z doskonałej odpowiedzi @ Suragcha, aby pokazać te różne opcje zaokrąglania w praktyce.
.awayFromZero
Zaokrąglić do najbliższej dozwolonej wartości, której wielkość jest większa lub równa wartości źródła; Brak bezpośredniego odpowiednik wśród funkcji C, jak ta wykorzystuje, warunkowo na znak
self
,ceil
lubfloor
, dla dodatnich i ujemnych wartościself
, odpowiednio..down
Odpowiednik
floor
funkcji C..toNearestOrAwayFromZero
Odpowiednik
round
funkcji C.Dostęp do tej reguły zaokrąglania można również uzyskać przy użyciu
rounded()
metody z zerowym argumentem ..toNearestOrEven
Zaokrąglij do najbliższej dozwolonej wartości; jeśli dwie wartości są jednakowo bliskie, wybierana jest parzysta; odpowiednik funkcji C
rint
(/ bardzo podobny donearbyint
)..towardZero
Odpowiednik
trunc
funkcji C.Jeśli celem zaokrąglania jest przygotowanie do pracy z liczbą całkowitą (np. Użycie
Int
przezFloatPoint
inicjalizację po zaokrągleniu), możemy po prostu skorzystać z faktu, że podczas inicjalizacji zaInt
pomocą aDouble
(lubFloat
itp.) Część dziesiętna zostanie obcięta..up
Odpowiednik
ceil
funkcji C.Dodatek: odwiedzenie kodu źródłowego w
FloatingPoint
celu sprawdzenia równoważności funkcji C z różnymiFloatingPointRoundingRule
regułamiJeśli chcemy, możemy spojrzeć na kod źródłowy
FloatingPoint
protokołu, aby bezpośrednio zobaczyć odpowiedniki funkcji C dlaFloatingPointRoundingRule
reguł publicznych .Ze swift / stdlib / public / core / FloatingPoint.swift.gyb widzimy, że domyślna implementacja
rounded(_:)
metody czyni nasround(_:)
metodą mutującą :Ze swift / stdlib / public / core / FloatingPointTypes.swift.gyb znajdujemy domyślną implementację
round(_:)
, w którejFloatingPointRoundingRule
widoczna jest równoważność między regułami a funkcjami zaokrąglającymi w C.źródło
źródło
Swift 3: Jeśli chcesz zaokrąglić do określonej liczby cyfr, np. 5,678434 -> 5,68, możesz po prostu połączyć funkcję round () lub roundf () z mnożeniem:
źródło
Możesz również przedłużyć FloatingPoint w Swift 3 w następujący sposób:
źródło
Self
znaczy?Szybki 3
źródło
myNum.rounded()
nie zmienia sięmyNum
, alemyNum.round()
zmienia.Możesz również chcieć sprawdzić, czy wartość double jest wyższa niż maksymalna wartość Int, zanim spróbujesz przekonwertować wartość na Int.
źródło
U mnie zadziałało bardzo proste rozwiązanie:
liczba zawiera wartość 2
źródło