Swift 3 & 4 - memanfaatkan rounded(_:)
metode ini sebagai cetak biru dalam FloatingPoint
protokol
The FloatingPoint
protokol (yang misalnya Double
dan Float
sesuai) cetak biru yang rounded(_:)
metode
func rounded(_ rule: FloatingPointRoundingRule) -> Self
Di mana FloatingPointRoundingRule
enum menyebutkan sejumlah aturan pembulatan yang berbeda:
case awayFromZero
Membulatkan ke nilai yang diizinkan terdekat yang besarnya lebih besar atau sama dengan nilai dari sumber.
case down
Membulatkan ke nilai yang diizinkan terdekat yang kurang dari atau sama dengan sumber.
case toNearestOrAwayFromZero
Membulatkan ke nilai yang diizinkan terdekat; jika dua nilai sama-sama dekat, yang dipilih dengan magnitudo lebih besar.
case toNearestOrEven
Membulatkan ke nilai yang diizinkan terdekat; jika dua nilai sama dekat, yang genap dipilih.
case towardZero
Membulatkan ke nilai yang diizinkan terdekat yang besarnya kurang dari atau sama dengan sumber.
case up
Membulatkan ke nilai yang diizinkan terdekat yang lebih besar dari atau sama dengan sumber.
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
atau floor
, untuk nilai positif dan negatif self
masing-masing.
3.000.rounded(.awayFromZero) // 3.0
3.001.rounded(.awayFromZero) // 4.0
3.999.rounded(.awayFromZero) // 4.0
(-3.000).rounded(.awayFromZero) // -3.0
(-3.001).rounded(.awayFromZero) // -4.0
(-3.999).rounded(.awayFromZero) // -4.0
.down
Setara dengan floor
fungsi C.
3.000.rounded(.down) // 3.0
3.001.rounded(.down) // 3.0
3.999.rounded(.down) // 3.0
(-3.000).rounded(.down) // -3.0
(-3.001).rounded(.down) // -4.0
(-3.999).rounded(.down) // -4.0
.toNearestOrAwayFromZero
Setara dengan round
fungsi C.
3.000.rounded(.toNearestOrAwayFromZero) // 3.0
3.001.rounded(.toNearestOrAwayFromZero) // 3.0
3.499.rounded(.toNearestOrAwayFromZero) // 3.0
3.500.rounded(.toNearestOrAwayFromZero) // 4.0
3.999.rounded(.toNearestOrAwayFromZero) // 4.0
(-3.000).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.001).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.499).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.500).rounded(.toNearestOrAwayFromZero) // -4.0
(-3.999).rounded(.toNearestOrAwayFromZero) // -4.0
Aturan pembulatan ini juga dapat diakses menggunakan rounded()
metode argumen nol .
3.000.rounded() // 3.0
// ...
(-3.000).rounded() // -3.0
// ...
.toNearestOrEven
Membulatkan ke nilai yang diizinkan terdekat; jika dua nilai sama dekat, yang genap dipilih; setara dengan fungsi C rint
(/ sangat mirip dengan nearbyint
).
3.499.rounded(.toNearestOrEven) // 3.0
3.500.rounded(.toNearestOrEven) // 4.0 (up to even)
3.501.rounded(.toNearestOrEven) // 4.0
4.499.rounded(.toNearestOrEven) // 4.0
4.500.rounded(.toNearestOrEven) // 4.0 (down to even)
4.501.rounded(.toNearestOrEven) // 5.0 (up to nearest)
.towardZero
Setara dengan trunc
fungsi C.
3.000.rounded(.towardZero) // 3.0
3.001.rounded(.towardZero) // 3.0
3.999.rounded(.towardZero) // 3.0
(-3.000).rounded(.towardZero) // 3.0
(-3.001).rounded(.towardZero) // 3.0
(-3.999).rounded(.towardZero) // 3.0
Jika tujuan pembulatan ini adalah untuk mempersiapkan untuk bekerja dengan integer (misalnya menggunakan Int
oleh FloatPoint
inisialisasi setelah pembulatan), kita mungkin hanya memanfaatkan fakta bahwa ketika menginisialisasi Int
menggunakan Double
(atau Float
dll), bagian desimal akan dipotong pergi.
Int(3.000) // 3
Int(3.001) // 3
Int(3.999) // 3
Int(-3.000) // -3
Int(-3.001) // -3
Int(-3.999) // -3
.up
Setara dengan ceil
fungsi C.
3.000.rounded(.up) // 3.0
3.001.rounded(.up) // 4.0
3.999.rounded(.up) // 4.0
(-3.000).rounded(.up) // 3.0
(-3.001).rounded(.up) // 3.0
(-3.999).rounded(.up) // 3.0
Tambahan: mengunjungi kode sumber untuk FloatingPoint
memverifikasi kesetaraan fungsi C dengan FloatingPointRoundingRule
aturan yang berbeda
Jika kita mau, kita dapat melihat kode sumber untuk FloatingPoint
protokol untuk langsung melihat setara fungsi C dengan FloatingPointRoundingRule
aturan publik .
Dari swift / stdlib / public / core / FloatingPoint.swift.gyb kita melihat bahwa implementasi default rounded(_:)
metode membuat kita dari round(_:)
metode mutating :
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
var lhs = self
lhs.round(rule)
return lhs
}
Dari swift / stdlib / public / core / FloatingPointTypes.swift.gyb kami menemukan implementasi default round(_:)
, di mana kesetaraan antara FloatingPointRoundingRule
aturan dan fungsi pembulatan C tampak jelas:
public mutating func round(_ rule: FloatingPointRoundingRule) {
switch rule {
case .toNearestOrAwayFromZero:
_value = Builtin.int_round_FPIEEE${bits}(_value)
case .toNearestOrEven:
_value = Builtin.int_rint_FPIEEE${bits}(_value)
case .towardZero:
_value = Builtin.int_trunc_FPIEEE${bits}(_value)
case .awayFromZero:
if sign == .minus {
_value = Builtin.int_floor_FPIEEE${bits}(_value)
}
else {
_value = Builtin.int_ceil_FPIEEE${bits}(_value)
}
case .up:
_value = Builtin.int_ceil_FPIEEE${bits}(_value)
case .down:
_value = Builtin.int_floor_FPIEEE${bits}(_value)
}
}
pow()
sayangnya tidak tersedia di taman bermain