Swift 3 & 4 - sử dụng rounded(_:)
phương thức như được thiết kế trong FloatingPoint
giao thức
Các FloatingPoint
giao thức (mà ví dụ Double
và Float
chiếu theo) đồ án các rounded(_:)
phương pháp
func rounded(_ rule: FloatingPointRoundingRule) -> Self
Trường hợp FloatingPointRoundingRule
liệ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
, ceil
hoặc floor
, cho các giá trị dương và âm self
tươ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 floor
hà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 round
hà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 trunc
hà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 Int
cách FloatPoint
khở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 Int
bằng cách sử dụng một Double
(hoặc Float
vv), 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 ceil
hà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 FloatingPointRoundingRule
quy tắc khác nhau
Nếu muốn, chúng ta có thể xem mã nguồn của FloatingPoint
giao thức để xem trực tiếp các hàm C tương đương với các FloatingPointRoundingRule
quy 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 FloatingPointRoundingRule
quy 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