根据第一个非零舍入到最近的 "nth"

Round number to nearest "nth" based on first non zero

我想将 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) 如果我知道位数,但我希望它适用于任何数字。是否有 swift 函数可以执行此操作?

您还没有具体说明 x = 1.002341 时发生了什么。根据你的有限情况,你可以使用这个:

func myRound (var number : Double) -> Double {
    if number == 0 {
        return number
    }

    let integerPart = floor(number)
    var base = 1.0

    number -= integerPart
    while abs(number) < 1 {
        number *= 10.0
        base *= 10.0
    }

    return integerPart + round(number) / base
}

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

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)) 的非小数部分给出了您用作乘数的数字的倒数的 10 的正幂或负幂。 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