Swift 3 & 4 - sử dụng rounded(_:)phương thức như được thiết kế trong FloatingPointgiao thức
Các FloatingPointgiao thức (mà ví dụ Doublevà Floatchiếu theo) đồ án các rounded(_:)phương pháp
func rounded(_ rule: FloatingPointRoundingRule) -> Self
Trường hợp FloatingPointRoundingRuleliệt kê một số quy tắc làm tròn khác nhau:
  case awayFromZero
  
  Làm tròn đến giá trị được phép gần nhất có cường độ lớn hơn hoặc bằng giá trị của nguồn.
  
  case down
  
  Làm tròn đến giá trị được phép gần nhất nhỏ hơn hoặc bằng nguồn.
  
  case toNearestOrAwayFromZero
  
  Làm tròn đến giá trị cho phép gần nhất; nếu hai giá trị gần bằng nhau, thì giá trị lớn hơn sẽ được chọn.
  
  case toNearestOrEven
  
  Làm tròn đến giá trị cho phép gần nhất; nếu hai giá trị gần bằng nhau, thì một giá trị chẵn được chọn.
  
  case towardZero
  
  Làm tròn đến giá trị được phép gần nhất có cường độ nhỏ hơn hoặc bằng giá trị của nguồn.
  
  case up
  
  Làm tròn đến giá trị được phép gần nhất lớn hơn hoặc bằng nguồn.
Chúng tôi sử dụng các ví dụ tương tự với các ví dụ từ câu trả lời xuất sắc của @ Suragch để hiển thị các tùy chọn làm tròn khác nhau này trong thực tế.
.awayFromZero
Làm tròn đến giá trị cho phép gần nhất có cường độ lớn hơn hoặc bằng giá trị của nguồn; không tương đương trực tiếp giữa các hàm C, vì điều này sử dụng, theo điều kiện có dấu self, ceilhoặc floor, cho các giá trị dương và âm selftương ứng.
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
Tương đương với floorhàm 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
Tương đương với roundhàm 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
Quy tắc làm tròn này cũng có thể được truy cập bằng rounded()phương thức đối số bằng không .
3.000.rounded() // 3.0
// ...
(-3.000).rounded() // -3.0
// ...
.toNearestOrEven
Làm tròn đến giá trị cho phép gần nhất; nếu hai giá trị gần bằng nhau, một giá trị chẵn được chọn; tương đương với hàm C rint(/ rất giống với 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
Tương đương với trunchàm 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
Nếu mục đích của làm tròn là để chuẩn bị làm việc với một số nguyên (ví dụ: sử dụng bằng Intcách FloatPointkhởi tạo sau khi làm tròn), chúng ta có thể chỉ cần sử dụng thực tế là khi khởi tạo Intbằng cách sử dụng một Double(hoặc Floatvv), phần thập phân sẽ bị cắt bớt.
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
Tương đương với ceilhàm 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
Phụ lục: truy cập mã nguồn FloatingPointđể xác minh các hàm C tương đương với các FloatingPointRoundingRulequy tắc khác nhau
Nếu muốn, chúng ta có thể xem mã nguồn của FloatingPointgiao thức để xem trực tiếp các hàm C tương đương với các FloatingPointRoundingRulequy tắc chung.
Từ swift / stdlib / public / core / FloatingPoint.swift.gyb, chúng ta thấy rằng việc triển khai mặc định của rounded(_:)phương thức làm cho chúng ta có round(_:)phương thức biến đổi :
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
    var lhs = self
    lhs.round(rule)
    return lhs
}
Từ swift / stdlib / public / core / FloatingPointTypes.swift.gyb, chúng tôi thấy việc triển khai mặc định round(_:), trong đó sự tương đương giữa các FloatingPointRoundingRulequy tắc và các hàm làm tròn C là rõ ràng:
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()tiếc, không có sẵn trong một sân chơi