舍入NSDecimalNumber

Nat*_*orn 23 cocoa objective-c rounding

我正在努力想出一些看起来应该非常简单的事情.我需要准确地将NSDecimalNumber舍入到特定数量的小数位(在运行时确定).据我所知,我有两个选项,我都不喜欢.

  1. 转换为浮点数,并使用C舍入函数:我不喜欢这样,因为在这种情况下准确性很重要.浮点数不能总是准确地表示十进制数,这可能会导致问题.
  2. 使用NSNumberFormatter转换为字符串然后转换回来:我不喜欢这个,因为它看起来很丑陋而效率低下.

还有另外一种我错过的方式吗?必须一个简单的方法来完成NSDecimalNumbers的舍入,但我似乎无法弄清楚它的生命是什么.

Cur*_*bit 33

您只需decimalNumberByRoundingAccordingToBehavior:使用所需的NSDecimalNumberBehaviors协议进行呼叫.请参阅开发文档中NSDecimalNumberBehaviors参考资料.

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


Dav*_*ton 20

对于那些喜欢示例代码的人......

要舍入到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];
Run Code Online (Sandbox Code Playgroud)

要舍入到最接近的千位(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];
Run Code Online (Sandbox Code Playgroud)


Har*_*oom 8

我使用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)
Run Code Online (Sandbox Code Playgroud)

请注意scale参数,用于定义所需的小数位数.在此概述:https://developer.apple.com/reference/foundation/nsdecimalnumberhandler/1578295-decimalnumberhandlerwithrounding