基于第一个非零的舍入到最接近的“第n”

我想将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) ,但我希望它适用于任何数字。 有这么快的function吗?

你可以用对数来获得一点乐趣来解决这个问题:

 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 

您没有指定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 }