我想知道,如果有一个Scala内置方法来获取整数的十进制表示的长度?
示例:45
有长度2
; 10321
有长度5
.
人们可以得到长度10321.toString.length
,但由于创建String对象时的开销,这有点气味.有更好的方法还是内置方法?
更新:
这绝对是个人喜好,但我认为没有分支的对数方法看起来更好。仅对于正值abs
,当然可以省略。
def digits(x: Int) = {
import math._
ceil(log(abs(x)+1)/log(10)).toInt
}
Run Code Online (Sandbox Code Playgroud)
如果你想要速度,那么类似下面的东西是相当不错的,假设随机分布:
def lengthBase10(x: Int) =
if (x >= 1000000000) 10
else if (x >= 100000000) 9
else if (x >= 10000000) 8
else if (x >= 1000000) 7
else if (x >= 100000) 6
else if (x >= 10000) 5
else if (x >= 1000) 4
else if (x >= 100) 3
else if (x >= 10) 2
else 1
Run Code Online (Sandbox Code Playgroud)
如果你想要的只是地板,那么计算双精度的对数就没有效率.
传统的递归方式是:
def len(x: Int, i: Int = 1): Int =
if (x < 10) i
else len(x / 10, i + 1)
Run Code Online (Sandbox Code Playgroud)
这比采用0到10e8范围内整数的日志要快.
lengthBase10
以上比其他一切快4倍.