【问题标题】:How to round an NSDecimalNumber in swift?如何快速舍入 NSDecimalNumber?
【发布时间】:2015-06-26 10:25:54
【问题描述】:

我在这方面找不到任何资源,我一直在尝试各种各样的东西,但没有任何效果。

根据 Apple 的文档,您可以像这样对 NSDecimalNumber 进行四舍五入:

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

它接受一个 NSDecimalNumberBehavior,我不确定如何操作它,因为它 (1) 不能被初始化为一个变量并改变它的属性,并且 (2) 根据文档的 roundingMode() 方法没有接受任何参数,但 Xcode 为“self”填充参数空间。

我完全迷失了这一点。回到基本问题;如何快速舍入 NSDecimalNumber?

提前致谢

【问题讨论】:

  • NSDecimalNumber.decimalNumberByRoundingAccordingToBehavior: 不是类方法。这意味着您可以调用十进制数实例,以获取其舍入值。

标签: xcode swift nsdecimalnumber


【解决方案1】:

你可以这样做

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))   

【讨论】:

  • 像 Swift 中的字符串操作和其他东西一样,是否有人会因为需要多少代码来简单地做到这一点而感到不安?
  • 这显然不是正确的答案。为什么这是公认的答案?问题是关于 NSDecimalNumber,而不是关于划分 Ints。
【解决方案2】:

NSDecimalNumberBehaviors 是一个协议,因此不能被实例化。您需要一个符合协议的 class 对象。苹果为此提供了 NSDecimalNumberHandler 类,例如:

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

scale 参数是您想要的小数位数,即 0 舍入为整数。

【讨论】:

  • 使用 defaultDecimalNumberHandler 似乎没有进行任何舍入。你能举个例子吗?
  • @Naldhelaan 我对默认处理程序不好,请参阅示例以了解如何构建自己的处理程序。
【解决方案3】:
// 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    相关资源
    最近更新 更多