如何在swift 2中舍入小数位

时间:2016-07-02 16:54:43

标签: xcode swift swift2 decimal rounding

尝试从字典中输出三个数字值的总和,然后将HST的总和增加13%。但是,计算打印为 $ 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)")

4 个答案:

答案 0 :(得分:3)

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

要实际舍入数字(而不是仅使用一定数量的小数位显示),您可以使用NSDecimalNumber

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

let hst = 1.13

let total = NSDecimalNumber(double: menu["Coke"]!)
    .decimalNumberByAdding(NSDecimalNumber(double: menu["Coffee"]!))
    .decimalNumberByAdding(NSDecimalNumber(double: menu["Water"]!))
    .decimalNumberByMultiplyingBy(NSDecimalNumber(double: hst), withBehavior: RoundingBehavior())

let message = "The total for your order is \(total)"

一般情况下,只使用NSNumberFormatter就足够了,但是如果您要使用这些舍入数字进行任何进一步的算术运算(例如,加上一堆舍入数字),您实际上必须对它们进行舍入,如上所示,而不是依赖于格式化程序。

注意,上面的RoundingBehavior被定义为舍入到两个小数位:

class RoundingBehavior: NSObject, NSDecimalNumberBehaviors {
    func roundingMode() -> NSRoundingMode {
        return .RoundPlain
    }

    func scale() -> Int16 {
        return 2
    }

    func exceptionDuringOperation(operation: Selector, error: NSCalculationError, leftOperand: NSDecimalNumber, rightOperand: NSDecimalNumber?) -> NSDecimalNumber? {
        return nil
    }
}

答案 1 :(得分:1)

通常 - 也是最通用的 - 方式是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)")

答案 2 :(得分:1)

不要圆,使用格式:

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的小数位数,因为它将使用应与货币值一起使用的小数位数。

答案 3 :(得分:0)

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