遇到一些代码,其中通过将数字转换为字符串然后使用 len() 来确定位数。
Function numOfDigits_len(n As Long) As Long
numOfDigits_len = Len(Str(n)) - 1
End Function
现在虽然这可行,但我知道与任何不使用字符串的方法相比它都会很慢,所以我写了一个使用 log() 的方法。
Function numOfDigits_log(n As Long) As Long
numOfDigits_log = Int(Log(n) / Log(10)) + 1
End Function
将运行时间缩短了 1/2,这很棒,但在特定情况下发生了一些奇怪的事情。
n numOfDigits_log(n)
===== ====================
999 3
1000 3
1001 4
它不会1000
正确处理。我认为这是因为浮点和舍入问题。
Function numOfDigits_loop(ByVal n As Long) As Long
Do Until n = 0
n = n \ 10
numOfDigits_loop = numOfDigits_loop + 1
Loop
End Function
当数字大于 10^6 时,写这个结果会慢约 10%,并且随着 n 变大,似乎会慢慢变大。如果我是务实的,那很好,但我想找到更理想的东西。
现在我的问题是,有没有办法准确地使用 log() 方法。我可以做类似的事情
Function numOfDigits_log(n As Long) As Long
numOfDigits_log = Int(Log(n) / Log(10) + 0.000000001) + 1
End Function
但它似乎很“hacky”。有没有比 log() 方法更快或更快的更好方法?注意:我意识到这种优化在很多情况下是没有意义的,但现在我遇到了这个我想“修复”它