谁能告诉我如何在Swift中舍入一个双数值到x位小数点后数位?

我有:

var totalWorkTimeInHours = (totalWorkTime/60/60)

totalWorkTime是一个NSTimeInterval (double),单位为秒。

totalWorkTimeInHours会给我小时数,但它给我的时间量是如此长的精确数字,例如1.543240952039......

当我打印totalWorkTimeInHours时,我如何将其四舍五入到1.543 ?


当前回答

Swift 4, Xcode 10

yourLabel.text =  String(format:"%.2f", yourDecimalValue)

其他回答

一个方便的方法是使用Double类型的扩展

extension Double {
    var roundTo2f: Double {return Double(round(100 *self)/100)  }
    var roundTo3f: Double {return Double(round(1000*self)/1000) }
}

用法:

let regularPie:  Double = 3.14159
var smallerPie:  Double = regularPie.roundTo3f  // results 3.142
var smallestPie: Double = regularPie.roundTo2f  // results 3.14

你可以使用Swift的round函数来实现这一点。

要对Double进行3位精度的四舍五入,首先将其乘以1000,四舍五入,然后将四舍五入结果除以1000:

let x = 1.23556789
let y = Double(round(1000 * x) / 1000)
print(y) /// 1.236

与任何类型的printf(…)或String(format:…)解决方案不同,此操作的结果仍然是Double类型。

编辑: 关于它有时不能工作的评论,请阅读这篇:每个程序员都应该知道的关于浮点算术的事情

这是一种长期的变通方法,如果您的需求稍微复杂一点,它可能会派上用场。你可以在Swift中使用数字格式化器。

let numberFormatter: NSNumberFormatter = {
    let nf = NSNumberFormatter()
    nf.numberStyle = .DecimalStyle
    nf.minimumFractionDigits = 0
    nf.maximumFractionDigits = 1
    return nf
}()

假设你想打印的变量是

var printVar = 3.567

这将确保它以所需的格式返回:

numberFormatter.StringFromNumber(printVar)

因此,这里的结果是“3.6”(四舍五入)。虽然这不是最经济的解决方案,但我这样做是因为OP提到了打印(在这种情况下String不是不可取的),并且因为该类允许设置多个参数。

在Swift 3.0和Xcode 8.0中:

extension Double {
    func roundTo(places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

像这样使用这个扩展:

let doubleValue = 3.567
let roundedValue = doubleValue.roundTo(places: 2)
print(roundedValue) // prints 3.56

当我打印totalWorkTimeInHours时,我如何将其四舍五入到1.543 ?

要将totalWorkTimeInHours四舍五入为3位数字以便打印,使用String构造函数,它接受一个格式字符串:

print(String(format: "%.3f", totalWorkTimeInHours))