我想将Double舍入到小数点后最接近的非零数字。

例如:

x = 0.002341
rounded = 0.002

x = 0.000048123
rounded = 0.00005

对于基数> 0的情况,它应该这样执行
x = 1.000234
rounded = 1.0002

我知道如果知道位数,就可以使用Double(round(1000*x)/1000),但是我希望它适用于任何数字。有一个快速功能可以做到这一点吗?

最佳答案

您可以使用对数来解决这个问题:

func roundFirst(x:Double) -> Double {
    if x == 0 {
        return x;
    }
    let mul : Double = pow(10, floor(log10(abs(x))))
    return round(x/mul)*mul
}
log10(abs(x))的非小数部分为您提供用作乘法器的数字的倒数的十的正或负幂。 floor删除小数,pow(10,...)为您提供了一个乘数,可用于舍入技巧。

我在操场上试了几次。这是我所拥有的:
println(roundFirst(0.002341))     // 0.002
println(roundFirst(0.000048123))  // 5e-05
println(roundFirst(0.0))          // 0.0
println(roundFirst(2.6))          // 3.0
println(roundFirst(123.0))        // 100
println(roundFirst(-0.002341))    // -0.002
println(roundFirst(-0.000048123)) // -5e-05
println(roundFirst(-2.6))         // -3.0
println(roundFirst(-123.0))       // -100

08-06 00:00