Swift 3 & 4 - Protokolde rounded(_:)
planlandığı gibi yöntemden yararlanmaFloatingPoint
FloatingPoint
Protokol (ki örn Double
ve Float
uygundur) ozalitler rounded(_:)
yöntemi
func rounded(_ rule: FloatingPointRoundingRule) -> Self
Burada FloatingPointRoundingRule
farklı 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
, ceil
ya da floor
pozitif ve negatif değerleri için, self
sı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 floor
iş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 round
iş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 trunc
iş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 Int
tarafından FloatPoint
yuvarlama sonra başlatma), biz sadece bir başlatılıyor gerçeği faydalanmak olabilir Int
bir kullanarak Double
(veya Float
ondalı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 ceil
iş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: FloatingPoint
C işlevlerinin farklı FloatingPointRoundingRule
kurallara eşdeğer olduğunu doğrulamak için kaynak kodunu ziyaret etme
FloatingPoint
İstersek, doğrudan ortak FloatingPointRoundingRule
kurallara 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, FloatingPointRoundingRule
kural 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