2015-06-26 29 views
10

Tôi không thể tìm thấy bất kỳ tài nguyên nào về điều này và tôi đã thử tất cả mọi thứ, nhưng không có gì hiệu quả.Làm thế nào để làm tròn số NSDecimalNumber nhanh chóng?

Theo tài liệu của Apple, bạn tròn một NSDecimalNumber như thế này:

NSDecimalNumber.decimalNumberByRoundingAccordingToBehavior(<#behavior: NSDecimalNumberBehaviors?#>) 

Phải mất trong một NSDecimalNumberBehavior, mà tôi không chắc chắn làm thế nào để vận dụng vì nó (1) không thể được kết nạp vào một biến và có các thuộc tính của nó đã thay đổi và (2) phương thức roundingMode() theo tài liệu không lấy bất kỳ tham số nào, nhưng Xcode điền vào một không gian tham số cho "self".

Tôi hoàn toàn bị mất về điều này. Quay lại câu hỏi cơ bản; Làm thế nào tôi có thể làm tròn một NSDecimalNumber nhanh chóng?

Cảm ơn trước

+0

NSDecimalNumber.decimalNumberByRoundingAccordingToBehavior: không phải là một phương pháp lớp. Điều này có nghĩa là bạn có thể gọi trên một thể hiện số thập phân, để có được giá trị làm tròn của nó. –

Trả lời

7

bạn có thể làm điều đó như thế

let x = 5 
let y = 2 
let total = x.decimalNumberByDividingBy(y).decimalNumberByRoundingAccordingToBehavior(NSDecimalNumberHandler(roundingMode: NSRoundingMode.RoundUp, scale: 0, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)) 
+1

Giống như thao tác chuỗi và những thứ khác trong Swift, có ai khác bị làm phiền bởi bao nhiêu mã được yêu cầu chỉ đơn giản là làm điều này? – NullHypothesis

7

NSDecimalNumberBehaviors là một giao thức và do đó không thể được khởi tạo. Bạn cần một đối tượng của một lớp phù hợp với giao thức. Apple cung cấp các lớp NSDecimalNumberHandler cho mục đích này, ví dụ .:

let handler = NSDecimalNumberHandler(roundingMode: NSRoundingMode.RoundBankers, scale: 0, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false) 
let rounded = dec.decimalNumberByRoundingAccordingToBehavior(handler) 

Đối số scale là số thập phân mà bạn muốn, ví dụ: 0 vòng để một số nguyên.

+0

Sử dụng defaultDecimalNumberHandler dường như không thực hiện bất kỳ làm tròn nào. bạn có thể cung cấp một ví dụ? – Naldhelaan

+0

@Naldhelaan Điều xấu của tôi liên quan đến trình xử lý mặc định, xem ví dụ về cách xây dựng của riêng bạn. – Arkku

1
// get a decimal num from a string 

let num = NSDecimalNumber.init(string: numStr) 

// create an NSDecimalNumberHandler instance 

let behaviour = NSDecimalNumberHandler(roundingMode:.RoundUp, 
scale: 1, raiseOnExactness: false, 
raiseOnOverflow: false, raiseOnUnderflow: 
false, raiseOnDivideByZero: false) 

// pass the handler to the method decimalNumberByRoundingAccordingToBehaviour. 

// This is an instance method on NSDecimalNumber that takes an object that 
// conforms to the protocol NSDecimalNumberBehaviors, which NSDecimalNumberHandler does! 

let numRounded = num.decimalNumberByRoundingAccordingToBehavior(behaviour) 
Các vấn đề liên quan