Swift 3 & 4 - Protokolde rounded(_:)planlandığı gibi yöntemden yararlanmaFloatingPoint
FloatingPointProtokol (ki örn Doubleve Floatuygundur) ozalitler rounded(_:)yöntemi
func rounded(_ rule: FloatingPointRoundingRule) -> Self
Burada FloatingPointRoundingRulefarklı yuvarlama kurallarının bir dizi numaralandırma bir enum olan:
case awayFromZero
Büyüklüğü kaynağınkinden büyük veya ona eşit olan en yakın değere yuvarlayın.
case down
Kaynağa eşit veya daha küçük olan, izin verilen en yakın değere yuvarlayın.
case toNearestOrAwayFromZero
İzin verilen en yakın değere yuvarlayın; iki değer eşit derecede yakınsa, daha büyük büyüklüğe sahip olan seçilir.
case toNearestOrEven
İzin verilen en yakın değere yuvarlayın; iki değer eşit derecede yakınsa, çift değer seçilir.
case towardZero
Büyüklüğü kaynağınkinden küçük veya ona eşit olan en yakın değere yuvarlayın.
case up
Kaynağa eşit veya daha büyük, izin verilen en yakın değere yuvarlayın.
Uygulamada bu farklı yuvarlama seçeneklerini göstermek için @ Suragch'ın mükemmel cevabından benzer örnekleri kullanıyoruz .
.awayFromZero
Büyüklüğü kaynağınkinden büyük veya ona eşit olan en yakın değere yuvarlayın; herhangi bir koşullu işaretine, bu kullanımlar için, C işlevleri arasında eşdeğer doğrudan self, ceilya da floorpozitif ve negatif değerleri için, selfsırasıyla.
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
C floorişlevine eşdeğerdir .
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
C roundişlevine eşdeğerdir .
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
Bu yuvarlama kuralına sıfır argüman rounded()yöntemi kullanılarak da erişilebilir .
3.000.rounded() // 3.0
// ...
(-3.000).rounded() // -3.0
// ...
.toNearestOrEven
İzin verilen en yakın değere yuvarlayın; iki değer eşit derecede yakınsa, çift değer seçilir; C rint(/ çok benzer nearbyint) fonksiyonuna eşdeğerdir .
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
C truncişlevine eşdeğerdir .
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
Yuvarlama amacı (örn kullanarak bir tamsayı ile işe hazırlamak için ise Inttarafından FloatPointyuvarlama sonra başlatma), biz sadece bir başlatılıyor gerçeği faydalanmak olabilir Intbir kullanarak Double(veya Floatondalık kısım uzakta kesilir vs).
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
C ceilişlevine eşdeğerdir .
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
Ek: FloatingPointC işlevlerinin farklı FloatingPointRoundingRulekurallara eşdeğer olduğunu doğrulamak için kaynak kodunu ziyaret etme
FloatingPointİstersek, doğrudan ortak FloatingPointRoundingRulekurallara C işlevi eşdeğerlerini görmek için protokolün kaynak koduna bakabiliriz .
Gönderen hızlı / stdlib / kamu / çekirdek / FloatingPoint.swift.gyb biz varsayılan uygulaması görüyoruz rounded(_:)yöntemin mutasyona bize yapar round(_:)yöntemiyle:
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
var lhs = self
lhs.round(rule)
return lhs
}
Gönderen Swift / stdlib / kamu / çekirdek / FloatingPointTypes.swift.gyb biz varsayılan uygulamasını bulmak round(_:)arasındaki denklik hangi, FloatingPointRoundingRulekural ve işlevleri yuvarlama C belirgindir:
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()ne yazık ki bir oyun alanında mevcut değil