数値を文字列にキャストしてから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
しかし、それは非常に「ハック」のようです。log() メソッドよりも高速または同程度の高速な方法はありますか? 注: この種の最適化は多くの場合無意味だと認識していますが、これに遭遇したので「修正」したいと思います。