2010-10-20 41 views
20

Tôi đang có thời gian khó khăn nhất để tìm ra một thứ có vẻ như nó rất đơn giản. Tôi cần phải chính xác vòng một NSDecimalNumber đến một số cụ thể của các chữ số thập phân (xác định tại thời gian chạy.) Cho đến nay như tôi có thể nói, tôi có hai lựa chọn, không phải là tôi thích.Làm tròn số NSDecimalNumber

  1. Chuyển sang phao và sử dụng chức năng làm tròn C: Tôi không thích điều này vì tính chính xác trong trường hợp này. Nổi không thể luôn đại diện chính xác số thập phân và điều này có thể gây ra sự cố.
  2. Chuyển đổi thành chuỗi bằng NSNumberFormatter và sau đó chuyển đổi lại: Tôi không thích điều này vì nó có vẻ xấu xí và không hiệu quả.

Có cách nào khác mà tôi đã bỏ lỡ không? Có là một cách dễ dàng để làm tròn số NSDecimalNumbers, nhưng tôi dường như không thể tìm ra cho cuộc sống của tôi đó là gì.

Trả lời

32

Bạn chỉ cần gọi decimalNumberByRoundingAccordingToBehavior: với giao thức NSDecimalNumberBehaviors mong muốn. Xem tham chiếu NSDecimalNumberBehaviors trong dev docs.

Cập nhật: Xem http://www.cimgf.com/2008/04/23/cocoa-tutorial-dont-be-lazy-with-nsdecimalnumber-like-me/

+0

Đó là vé! Cảm ơn! –

+0

Liên kết tuyệt vời quá :-) –

+0

RTFM không phải là phản hồi. Câu trả lời là "Bạn chỉ cần gọi decimalNumberByRoundingAccordingToBehavior: với giao thức NSDecimalNumberBehaviors mong muốn." Các tài liệu dev được tham chiếu để cung cấp việc liệt kê các giao thức khác nhau thay vì sao chép chúng ở đây. – CuriousRabbit

17

Đối với những người thích mã ví dụ ...

Để làm tròn đến 2 chữ số thập phân (12345,68):

NSDecimalNumber *originalNumber = [NSDecimalNumber decimalNumberWithString:@"12345.6789"]; 
NSDecimalNumberHandler *behavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain 
                          scale:2 
                       raiseOnExactness:NO 
                       raiseOnOverflow:NO 
                       raiseOnUnderflow:NO 
                      raiseOnDivideByZero:NO]; 

NSDecimalNumber *roundedNumber = [originalNumber decimalNumberByRoundingAccordingToBehavior:behavior]; 

Để tròn đến hàng nghìn gần nhất (12000):

NSDecimalNumber *originalNumber = [NSDecimalNumber decimalNumberWithString:@"12345.6789"]; 
NSDecimalNumberHandler *behavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain 
                          scale:-3 
                       raiseOnExactness:NO 
                       raiseOnOverflow:NO 
                       raiseOnUnderflow:NO 
                      raiseOnDivideByZero:NO]; 

NSDecimalNumber *roundedNumber = [originalNumber decimalNumberByRoundingAccordingToBehavior:behavior]; 
3

Tôi đã làm việc này bằng cách sử dụng mã bên dưới trong Swift 3.

let amount = NSDecimalNumber(string: "123.456789") 
let handler = NSDecimalNumberHandler(roundingMode: .plain, scale: 2, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false) 
let roundedAmount = amount.rounding(accordingToBehavior: handler) 

Lưu ý tham số tỷ lệ, được sử dụng để xác định số thập phân bạn cần. Được nêu ở đây: https://developer.apple.com/reference/foundation/nsdecimalnumberhandler/1578295-decimalnumberhandlerwithrounding

0

Tôi đang sử dụng giải pháp này:

import Foundation 

extension NSDecimalNumber { 
    public func round(_ decimals:Int) -> NSDecimalNumber { 
     return self.rounding(accordingToBehavior: 
      NSDecimalNumberHandler(roundingMode: .plain, 
            scale: Int16(decimals), 
            raiseOnExactness: false, 
            raiseOnOverflow: false, 
            raiseOnUnderflow: false, 
            raiseOnDivideByZero: false)) 
    } 
} 

let amount = NSDecimalNumber(string: "123.456") 

amount.round(2) --> 123.46 
amount.round(1) --> 123.5 
amount.round(0) --> 123 
amount.round(-1) --> 120 
amount.round(-2) --> 100 
Các vấn đề liên quan