是否有Scala方式来获取数字的长度?

Joh*_*ood 1 scala numbers

我想知道,如果有一个Scala内置方法来获取整数的十进制表示的长度?

示例:45有长度2; 10321有长度5.

人们可以得到长度10321.toString.length,但由于创建String对象时的开销,这有点气味.有更好的方法还是内置方法?

更新:

  • "更好"是指更快的解决方案
  • 我只对正整数感兴趣

bse*_*old 5

这绝对是个人喜好,但我认为没有分支的对数方法看起来更好。仅对于正值abs,当然可以省略。

def digits(x: Int) = {
    import math._
    ceil(log(abs(x)+1)/log(10)).toInt
}
Run Code Online (Sandbox Code Playgroud)


Lui*_*hys 5

如果你想要速度,那么类似下面的东西是相当不错的,假设随机分布:

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倍.