स्विफ्ट 3 और 4 - प्रोटोकॉल rounded(_:)
में ब्लूप्रिंट के रूप में विधि का FloatingPoint
उपयोग करना
FloatingPoint
प्रोटोकॉल (जो जैसे को Double
और Float
अनुरूप) ब्लूप्रिंट rounded(_:)
विधि
func rounded(_ rule: FloatingPointRoundingRule) -> Self
जहां FloatingPointRoundingRule
कई अलग-अलग गोलाई नियमों की गणना करने वाली एक एनुम है:
case awayFromZero
निकटतम अनुमत मूल्य पर गोल जिसका परिमाण स्रोत से अधिक या उसके बराबर है।
case down
निकटतम अनुमत मान पर गोल जो स्रोत से कम या उसके बराबर है।
case toNearestOrAwayFromZero
निकटतम अनुमत मूल्य पर गोल; यदि दो मूल्य समान रूप से पास हैं, तो अधिक परिमाण वाले व्यक्ति को चुना जाता है।
case toNearestOrEven
निकटतम अनुमत मूल्य पर गोल; यदि दो मूल्य समान रूप से पास हैं, तो भी एक को चुना जाता है।
case towardZero
निकटतम अनुमत मूल्य पर गोल जिसका परिमाण स्रोत से कम या उसके बराबर है।
case up
निकटतम अनुमत मान पर गोल जो स्रोत से अधिक या उसके बराबर है।
हम अभ्यास में इन विभिन्न दौर विकल्पों को दिखाने के लिए @ सुरगच के उत्कृष्ट उत्तर से लोगों के लिए समान उदाहरण का उपयोग करते हैं।
.awayFromZero
निकटतम अनुमत मूल्य का गोल जिसका परिमाण स्रोत से अधिक या उसके बराबर है; कोई सी कार्यों में बराबर प्रत्यक्ष, इस का उपयोग करता है के रूप में, सशर्त के हस्ताक्षर पर self
, ceil
या floor
, के सकारात्मक और नकारात्मक मूल्यों के लिए self
, क्रमशः।
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
फ़ंक्शन के बराबर ।
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
फ़ंक्शन के बराबर ।
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
यह तर्क नियम शून्य तर्क rounded()
विधि का उपयोग करके भी एक्सेस किया जा सकता है ।
3.000.rounded() // 3.0
// ...
(-3.000).rounded() // -3.0
// ...
.toNearestOrEven
निकटतम अनुमत मूल्य पर गोल; यदि दो मूल्य समान रूप से पास हैं, तो भी एक को चुना जाता है; C rint
(/ बहुत समान 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
C trunc
फ़ंक्शन के बराबर ।
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
यदि गोलाई का उद्देश्य पूर्णांक के साथ काम करने के लिए तैयार करना है (जैसे Int
कि FloatPoint
गोलाई के बाद आरंभीकरण द्वारा उपयोग करना), तो हम बस इस तथ्य का उपयोग कर सकते हैं कि जब Int
एक Double
(या Float
आदि) का उपयोग करते हुए , दशमलव भाग को छोटा कर दिया जाएगा।
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
फ़ंक्शन के बराबर ।
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
परिशिष्ट: FloatingPoint
विभिन्न FloatingPointRoundingRule
नियमों के लिए सी फ़ंक्शन तुल्यता को सत्यापित करने के लिए स्रोत कोड पर जाकर
यदि हम चाहें, तो हम FloatingPoint
प्रोटोकॉल के लिए स्रोत कोड पर एक नज़र डाल सकते हैं ताकि सार्वजनिक FloatingPointRoundingRule
नियमों के सी फ़ंक्शन समकक्षों को सीधे देखा जा सके ।
से तेज / stdlib / सार्वजनिक / कोर / FloatingPoint.swift.gyb हम देखते हैं के डिफ़ॉल्ट कार्यान्वयन कि rounded(_:)
विधि हमें परिवर्तनशील का बना देता है round(_:)
विधि:
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
var lhs = self
lhs.round(rule)
return lhs
}
से तेज / stdlib / सार्वजनिक / कोर / FloatingPointTypes.swift.gyb हम के डिफ़ॉल्ट कार्यान्वयन लगता है round(_:)
, जिसमें बीच तुल्यता FloatingPointRoundingRule
नियमों और सी कार्यों गोलाई स्पष्ट है:
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()
दुर्भाग्य से एक खेल के मैदान में उपलब्ध नहीं है