Swift 3 & 4 - ใช้ประโยชน์จากrounded(_:)วิธีพิมพ์เขียวในFloatingPointโปรโตคอล
FloatingPointโปรโตคอล (ซึ่งเช่นDoubleและFloatสอด) พิมพ์เขียวrounded(_:)วิธี
func rounded(_ rule: FloatingPointRoundingRule) -> Self
โดยFloatingPointRoundingRuleenum จะระบุกฎการปัดเศษที่แตกต่างกันจำนวนหนึ่งอยู่ที่ไหน:
case awayFromZero
ปัดเศษเป็นค่าที่อนุญาตที่ใกล้เคียงที่สุดซึ่งมีขนาดใหญ่กว่าหรือเท่ากับของแหล่งที่มา
case down
ปัดเศษเป็นค่าที่อนุญาตที่ใกล้เคียงที่สุดซึ่งน้อยกว่าหรือเท่ากับแหล่งที่มา
case toNearestOrAwayFromZero
ปัดเศษเป็นค่าที่อนุญาตใกล้เคียงที่สุด หากสองค่าใกล้กันเท่ากันค่าที่มีขนาดใหญ่กว่าจะถูกเลือก
case toNearestOrEven
ปัดเศษเป็นค่าที่อนุญาตใกล้เคียงที่สุด หากสองค่าใกล้กันเท่ากันค่าที่เลือกไว้
case towardZero
ปัดเศษเป็นค่าที่อนุญาตที่ใกล้เคียงที่สุดซึ่งมีขนาดน้อยกว่าหรือเท่ากับของแหล่งที่มา
case up
ปัดเศษเป็นค่าที่อนุญาตที่ใกล้เคียงที่สุดที่มากกว่าหรือเท่ากับแหล่งที่มา
เราใช้ตัวอย่างที่คล้ายกันกับคำตอบที่ยอดเยี่ยมของ @ Suragchเพื่อแสดงตัวเลือกการปัดเศษที่แตกต่างกันเหล่านี้ในทางปฏิบัติ
.awayFromZero
ปัดเศษเป็นค่าที่อนุญาตที่ใกล้เคียงที่สุดซึ่งมีขนาดใหญ่กว่าหรือเท่ากับของแหล่งที่มา ไม่มีตรงเทียบเท่าหมู่ฟังก์ชัน C ในขณะที่การใช้งานนี้มีเงื่อนไขในการเข้าสู่ระบบของ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
เทียบเท่ากับfloorฟังก์ชั่น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
เทียบเท่ากับroundฟังก์ชั่น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
กฎการปัดเศษนี้ยังสามารถเข้าถึงได้โดยใช้ศูนย์การโต้แย้งวิธี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
เทียบเท่ากับtruncฟังก์ชั่น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
หากวัตถุประสงค์ของการปัดเศษคือการเตรียมการทำงานกับจำนวนเต็ม (เช่นการใช้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
เทียบเท่ากับceilฟังก์ชั่น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
ภาคผนวก: การเยี่ยมชมซอร์สโค้ดสำหรับFloatingPointตรวจสอบฟังก์ชัน C ที่เทียบเท่ากับFloatingPointRoundingRuleกฎต่างๆ
หากเราต้องการเราสามารถดูซอร์สโค้ดของFloatingPointโปรโตคอลเพื่อดูฟังก์ชัน C โดยตรงกับFloatingPointRoundingRuleกฎสาธารณะ
จากswift / stdlib / public / core / FloatingPoint.swift.gybเราเห็นว่าการใช้งานเริ่มต้นของrounded(_:)วิธีทำให้เรากลายเป็นround(_:)วิธีการกลายพันธุ์:
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
var lhs = self
lhs.round(rule)
return lhs
}
จากswift / stdlib / public / core / FloatingPointTypes.swift.gybเราพบว่ามีการใช้งานเริ่มต้นround(_:)ซึ่งมีความเท่าเทียมกันระหว่างFloatingPointRoundingRuleกฎและฟังก์ชั่นการปัดเศษ C:
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()น่าเสียดายที่ไม่สามารถใช้ได้ในสนามเด็กเล่น