如何舍入Decimal类型?

时间:2017-09-06 06:25:16

标签: swift3 decimal

使用Swift3仍然可以解决问题。我正在使用Decimal类型,因为它涉及货币,而我正在艰难地完成四舍五入的工作。我已经阅读了NSDecimalNumberHandler文档和rounding函数,但不太了解如何使其工作。基本上我只希望这个类中的所有Decimal类型在我构建的计算函数运行时舍入到百分之一点。

有人可以给我一个如何做到这一点的快速示例吗?谢谢!

3 个答案:

答案 0 :(得分:0)

您永远不应将货币值保存为十进制数。总是使用整数,如下所示:

1.00$ = 100
4567.89$ = 456789

然后当你想要以美分呈现时,你可以除以100。

请参阅:Why not use Double or Float to represent currency?

答案 1 :(得分:0)

请检查:

这是使用NSDecimalNumber& NSDecimalNumberHandler:

let decimalStr = NSDecimalNumber(string: "500.2595")
let decimalStrHandler = NSDecimalNumberHandler(roundingMode: .plain, scale: 3, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)
let roundedVal = decimalStr.rounding(accordingToBehavior: decimalStrHandler)
print(roundedVal) // prints 500.26

这是使用NumberFormatter&十进制:

extension Decimal {
    func roundDecimal() -> String {
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = 2
        return formatter.string(from: self as NSDecimalNumber)!
    }
}

你必须像下面这样打电话:

let decimalStr = Decimal(string: "500.2595")!
print(decimalStr.roundDecimal()) // prints 500.26

let decimalFloat = Decimal(floatLiteral: 500.2595)
print(decimalFloat.roundDecimal())  // prints 500.26

答案 2 :(得分:-1)

有一个名为NSDecimalRound的特定功能可用于此目的。这是Decimal的扩展,可用于获取标准的roundrounded函数:

extension Decimal {
    mutating func round(_ scale: Int, _ roundingMode: NSDecimalNumber.RoundingMode) {
        var localCopy = self
        NSDecimalRound(&self, &localCopy, scale, roundingMode)
    }

    func rounded(_ scale: Int, _ roundingMode: NSDecimalNumber.RoundingMode) -> Decimal {
        var result = Decimal()
        var localCopy = self
        NSDecimalRound(&result, &localCopy, scale, roundingMode)
        return result
    }
}