Swift 3 & 4 - memanfaatkan rounded(_:)metode ini sebagai cetak biru dalam FloatingPointprotokol
The FloatingPointprotokol (yang misalnya Doubledan Floatsesuai) cetak biru yang rounded(_:)metode
func rounded(_ rule: FloatingPointRoundingRule) -> Self
Di mana FloatingPointRoundingRuleenum 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, ceilatau floor, untuk nilai positif dan negatif selfmasing-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 floorfungsi 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 roundfungsi 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 truncfungsi 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 Intoleh FloatPointinisialisasi setelah pembulatan), kita mungkin hanya memanfaatkan fakta bahwa ketika menginisialisasi Intmenggunakan Double(atau Floatdll), 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 ceilfungsi 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 FloatingPointmemverifikasi kesetaraan fungsi C dengan FloatingPointRoundingRuleaturan yang berbeda
Jika kita mau, kita dapat melihat kode sumber untuk FloatingPointprotokol untuk langsung melihat setara fungsi C dengan FloatingPointRoundingRuleaturan 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 FloatingPointRoundingRuleaturan 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