Seasons.NET

ちょっとした技術ブログです

対数を使った数値の0詰め処理について解説してみた

JavaScriptでsprintfのフォーマット書式みたいに桁数に満たない数字の場合、
左0詰めをしてほしいのですが、それがないっぽいので調べていたところ。

こちらの記事にその式が掲載されており、
対数に対する知識が少し乏しかったので
学習がてらキモになるところ調べてみました。


ポイントとなるのは、

Math.log(x) * Math.LOG10E

だと思います。これがなぜいきなり出てきているか?を解説してみます。
あとの計算は非常に簡単なので解説を割愛します。


まず数字の桁数を求める前に,
10 = 10 = pow(10,1)
100 = 10x10 = pow(10,2)
1000 = 10x10x10 = pow(10,3)
と表すことができるのはわかりますよね。


powの第2引数は、指数を示しているわけですが、
この数に+1した数が桁数になっていますよね。
この指数(x)にあたる数を求めるには、10を底とするxの対数 = log10^x


そこで問題になるのは、Math.log(x)で求めることが出来る数値が
自然対数eを底とするxの対数であるということです。

Math.log( 10 ) = 2.302585092994046
10 = e^2.30259
となるわけですね。


今欲しいのは、10を底とするxの対数なので、
Wikipediaより、

log10^x = loge^x * log10^e

と式を変換することができるので、さらにこちらの記事を参考に、

loge^x = Math.log( x )
log10^e = Math.LOG10E

となります。


これによって

log10^x = Math.log(x) * Math.LOG10E

と式を置き換えることができるので最初に紹介したエントリーの式のようになるわけです。


ちょっとした式もこうして調べてみると理解もぐっと深まります。


[[追記:]]
こちらの元記事の方は、
number=0の場合、-infとなりそこでプログラムが暴走してしまうので気を付けましょう。