我想将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