Saya mencoba membuat kalkulator tingkat pertumbuhan ( Double
) yang akan membulatkan hasil ke Integer terdekat dan menghitung ulang dari sana, dengan demikian:
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
}
tapi saya belum bisa sejauh ini.
EDIT saya agak melakukannya seperti itu:
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
}
Walaupun saya tidak keberatan bahwa itu selalu dibulatkan, saya tidak suka karena firstUsers
harus menjadi variabel dan berubah sepanjang program (untuk membuat perhitungan selanjutnya), yang saya tidak ingin itu terjadi.
pow()
sayangnya tidak tersedia di taman bermainpow()
didefinisikan di perpustakaan Darwin, jadi Anda harusimport Darwin
terlebih dahulu (import Foundation
atauimport Cocoa
atauimport UIKit
, yang semuanya mengimpor Darwin secara internal).lround()
yang mengembalikan sebuahInt
.round()
selalu dibulatkan ke atas ketika tempat desimal>> .5 dan turun ketika itu <.5 (pembulatan standar)." Kecuali kalau tidak.round(-16.5)
mengembalikan -17, bukan -16. Apakah ini bug?Untuk membulatkan dobel ke bilangan bulat terdekat, cukup gunakan
round()
.Jika Anda tidak ingin mengubah nilai asli, gunakan
rounded()
:Seperti yang mungkin orang harapkan ( atau mungkin tidak ), angka seperti
3.5
dibulatkan ke atas dan angka seperti-3.5
dibulatkan ke bawah. Jika Anda membutuhkan perilaku pembulatan yang berbeda dari itu, Anda bisa menggunakan salah satu aturan pembulatan . Sebagai contoh:Jika Anda membutuhkan aktual,
Int
maka hanya melemparkannya ke satu (tetapi hanya jika Anda yakin bahwa Double tidak akan lebih besar dariInt.max
):Catatan
round
,lround
,floor
, danceil
. Namun, sekarang karena Swift memiliki fungsi ini, saya tidak bisa lagi merekomendasikan untuk menggunakan fungsi-fungsi itu. Terima kasih kepada @dfri karena menunjukkan hal ini kepada saya. Lihat @ jawaban dfri di sini . Saya juga melakukan hal serupa untuk pembulatan aCGFloat
.sumber
Swift 3 & 4 - memanfaatkan
rounded(_:)
metode ini sebagai cetak biru dalamFloatingPoint
protokolThe
FloatingPoint
protokol (yang misalnyaDouble
danFloat
sesuai) cetak biru yangrounded(_:)
metodeDi mana
FloatingPointRoundingRule
enum menyebutkan sejumlah aturan pembulatan yang berbeda:Kami menggunakan contoh serupa dengan yang ada di @ Suragch sebagai jawaban terbaik untuk menunjukkan opsi pembulatan yang berbeda ini dalam praktik.
.awayFromZero
Membulatkan ke nilai yang diizinkan terdekat yang besarnya lebih besar atau sama dengan nilai dari sumber; tidak ada ekuivalen langsung di antara fungsi C, karena ini menggunakan, kondisional pada tanda
self
,ceil
ataufloor
, untuk nilai positif dan negatifself
masing-masing..down
Setara dengan
floor
fungsi C..toNearestOrAwayFromZero
Setara dengan
round
fungsi C.Aturan pembulatan ini juga dapat diakses menggunakan
rounded()
metode argumen nol ..toNearestOrEven
Membulatkan ke nilai yang diizinkan terdekat; jika dua nilai sama dekat, yang genap dipilih; setara dengan fungsi C
rint
(/ sangat mirip dengannearbyint
)..towardZero
Setara dengan
trunc
fungsi C.Jika tujuan pembulatan ini adalah untuk mempersiapkan untuk bekerja dengan integer (misalnya menggunakan
Int
olehFloatPoint
inisialisasi setelah pembulatan), kita mungkin hanya memanfaatkan fakta bahwa ketika menginisialisasiInt
menggunakanDouble
(atauFloat
dll), bagian desimal akan dipotong pergi..up
Setara dengan
ceil
fungsi C.Tambahan: mengunjungi kode sumber untuk
FloatingPoint
memverifikasi kesetaraan fungsi C denganFloatingPointRoundingRule
aturan yang berbedaJika kita mau, kita dapat melihat kode sumber untuk
FloatingPoint
protokol untuk langsung melihat setara fungsi C denganFloatingPointRoundingRule
aturan publik .Dari swift / stdlib / public / core / FloatingPoint.swift.gyb kita melihat bahwa implementasi default
rounded(_:)
metode membuat kita dariround(_:)
metode mutating :Dari swift / stdlib / public / core / FloatingPointTypes.swift.gyb kami menemukan implementasi default
round(_:)
, di mana kesetaraan antaraFloatingPointRoundingRule
aturan dan fungsi pembulatan C tampak jelas:sumber
sumber
Swift 3: Jika Anda ingin membulatkan ke angka digit tertentu mis. 5.678434 -> 5.68 Anda bisa menggabungkan fungsi round () atau roundf () dengan perkalian:
sumber
Anda juga dapat memperluas FloatingPoint di Swift 3 sebagai berikut:
sumber
Self
artinya?Cepat 3
sumber
myNum.rounded()
tidak berubahmyNum
, tetapimyNum.round()
tidak.Anda mungkin juga ingin memeriksa apakah dobel lebih tinggi dari nilai Int maks sebelum mencoba untuk mengubah nilai menjadi Int.
sumber
Solusi yang sangat mudah untuk saya:
angka berisi nilai 2
sumber