簡體   English   中英

舍入NSDecimalNumber

[英]Rounding NSDecimalNumber

我正在努力想出一些看起來應該非常簡單的事情。 我需要准確地將NSDecimalNumber舍入到特定數量的小數位(在運行時確定)。據我所知,我有兩個選項,我都不喜歡。

  1. 轉換為浮點數,並使用C舍入函數:我不喜歡這樣,因為在這種情況下准確性很重要。 浮點數不能總是准確地表示十進制數,這可能會導致問題。
  2. 使用NSNumberFormatter轉換為字符串然后轉換回來:我不喜歡這個,因為它看起來很丑陋而效率低下。

還有另外一種我錯過的方式嗎? 必須一個簡單的方法來完成NSDecimalNumbers的舍入,但我似乎無法弄清楚它的生命是什么。

您只需使用所需的NSDecimalNumberBehaviors協議調用decimalNumberByRoundingAccordingToBehavior: . 請參閱開發文檔中NSDecimalNumberBehaviors參考。

更新:見http://www.cimgf.com/2008/04/23/cocoa-tutorial-dont-be-lazy-with-nsdecimalnumber-like-me/

對於那些喜歡示例代碼的人......

要舍入到2位小數(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];

要舍入到最接近的千位(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];

我使用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)

請注意scale參數,用於定義所需的小數位數。 在此概述: https//developer.apple.com/reference/foundation/nsdecimalnumberhandler/1578295-decimalnumberhandlerwithrounding

我正在使用這個解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM