Swift 3 & 4 - ใช้ประโยชน์จากrounded(_:)
วิธีพิมพ์เขียวในFloatingPoint
โปรโตคอล
FloatingPoint
โปรโตคอล (ซึ่งเช่นDouble
และFloat
สอด) พิมพ์เขียวrounded(_:)
วิธี
func rounded(_ rule: FloatingPointRoundingRule) -> Self
โดยFloatingPointRoundingRule
enum จะระบุกฎการปัดเศษที่แตกต่างกันจำนวนหนึ่งอยู่ที่ไหน:
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()
น่าเสียดายที่ไม่สามารถใช้ได้ในสนามเด็กเล่น