根据第一个非零舍入到最近的 "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
我想将 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