対数を使った数値の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の対数 =
そこで問題になるのは、Math.log(x)で求めることが出来る数値が
自然対数eを底とするxの対数であるということです。
Math.log( 10 ) = 2.302585092994046 10 =となるわけですね。
今欲しいのは、10を底とするxの対数なので、
Wikipediaより、
と式を変換することができるので、さらにこちらの記事を参考に、
となります。
これによって
と式を置き換えることができるので最初に紹介したエントリーの式のようになるわけです。
ちょっとした式もこうして調べてみると理解もぐっと深まります。
[[追記:]]
こちらの元記事の方は、
number=0の場合、-infとなりそこでプログラムが暴走してしまうので気を付けましょう。