如何舍入 swift 2 中的小数位

How to round decimal places in swift 2

尝试输出字典中三个数值的总和,然后将 13% 的 HST 添加到总和。但是,计算结果显示为 $13.5261,保留四位小数。我如何去掉小数点后的位置,所以它是 13.52 美元?或者有没有办法四舍五入,所以它是 13.53 美元

import UIKit 


 var menu = ["Coke": 1.99, "Coffee": 3.99, "Water": 5.99]

 var hst = 1.13

 var total = hst * (menu["Coke"]! + menu["Coffee"]! + menu["Water"]!)


 print("The total for your order is
 $\(total)")

通常的——也是最通用的——方式是NSNumberFormatter

let menu = ["Coke": 1.99, "Coffee": 3.99, "Water": 5.99]

let hst = 1.13

let total = hst * (menu["Coke"]! + menu["Coffee"]! + menu["Water"]!)

let formatter = NSNumberFormatter()   
formatter.maximumFractionDigits = 2
let roundedTotal = formatter.stringFromNumber(total)!

print("The total for your order is $\(roundedTotal)")

不要四舍五入,使用格式:

let total: Double = 13.5261
let currency = "USD"

let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = currency

print("The total for your order is \(formatter.string(from: total as NSNumber)!)")

这将在所有语言环境中正确打印金额,并且货币符号位置正确。

您不必关心 .currency 的小数位数,因为它将使用应与货币值一起使用的小数位数。

import Darwin
let d0 = 1.12345654
let r0 = round(d0)                          // 1
let r1 = round(10 * d0) / 10                // 1.1
let r2 = round(100 * d0) / 100              // 1.12
//...
let r7 = round(10000000 * d0) / 10000000    // 1.1234565

要格式化浮点数,四舍五入到一定位数,请使用其他人讨论的 NSNumberFormatter

要对数字进行四舍五入(而不是仅仅使用特定的小数位数来显示它),您可以使用 Decimal:

let menu = ["Coke": 1.99, "Coffee": 3.99, "Water": 5.99]
let hst = 1.13

let subtotal = menu
    .map { Decimal([=10=].value).round(2) } // convert the values to decimals
    .reduce(Decimal(0), +)              // add them up

let rate = Decimal(hst).round(2)        // get rate as decimal
let total = subtotal * rate             // calculate total
let result = (subtotal * rate).round(2) // round it

通常,只使用 NSNumberFormatter 就足够了,但是如果您要对这些四舍五入的数字进行任何后续运算(例如,将一堆四舍五入的数字相加),您实际上必须对它们进行四舍五入,如上所示,而不是依赖格式化程序。

FWIW,这是上面使用的舍入例程:

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