2017-09-06 48 views
0

使用Swift3並仍然陷入困境。我正在使用Decimal類型,因爲它涉及到貨幣,我正在艱難地完成四捨五入的工作。我已閱讀NSDecimalNumberHandler文檔和函數,但不太明白如何使其發揮作用。從本質上講,我只是希望當我構建的計算函數運行時,該類中的所有Decimal類型都可以達到百分之一點。如何四捨五入十進制類型?

有人可以給我如何做到這一點的快速例子嗎?謝謝!

回答

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 
+0

這看起來像它會返回一個字符串。我想要返回變量的值作爲十進制取整到百分之一位置(使用NSDecimalNumber.RoundingMode中的.plain取整樣式)。 – Grimes47

+0

已更新答案。請檢查 –

+0

Vini App,非常感謝。我使用了擴展方法,它工作。真的很感激它。我知道Decimal是一個結構體,而不是一個類,從我讀的它是在Swift 3中引入的。我喜歡Decimal,但希望我不必每次都使用NSDecimalNumber方法進行投射。 – Grimes47

0

您不應該將貨幣值保存爲十進制數。始終使用整數,像這樣:

1.00$ = 100 
4567.89$ = 456789 

然後當你想不存在它美分,你可以通過100

劃分參見本:Why not use Double or Float to represent currency?

+0

我不使用一個雙/浮點,我使用十進制結構(HTTPS:/ /developer.apple.com/documentation/foundation/decimal)。我知道Float/Doubles不能精確地存儲小數,但我的理解是Decimal可以用於我所需要的。 – Grimes47

+0

「小數」是一種專門用於存儲貨幣的類型,因爲它使用了十進制的高精度算術。 – Sulthan

+0

噢好吧,對不起,似乎我沒有讀好這個問題。 – Lukas