自分は今まで使ったことないです。しかし、この技術の応用はよくします。
今回のゴール
さて、今回作る関数は以下のようになります。
function ceil(n, m) { return Math.ceil(n/Math.pow(10, m+1))*Math.pow(10, m+1); }
使い方は、第一引数に四捨五入したい数を、第二引数にnの位のnを底10で対数を取った値を渡します。例えば ceil(1396, 2) は1396を102、つまり100の位で四捨五入します。当然返り値は1000です。 釈然としなかったので一応第二引数に位を直接渡せる関数も作ります。
function ceil2(n, m) { return Math.ceil(n/m)*m; }
これで ceil2(1396, 100) で1396を100の位で四捨五入できます。
動作説明
さて、では順に何をしているのか見ていきます。まず、100の位が小数点第1位にくるように1000で割ります。小数点第1位にある数字はMath.ceil()で四捨五入できるからです。 Math.ceil()を使うことで四捨五入の処理はネイティヴに投げることができ、無事100の位で四捨五入ができました。しかし、このままでは100の位が小数点第1位にある状態になってしまっています。 そこで、最初に割った1000を今度はかけます。こうすれば元の桁数になり無事に計算できるわけです。
終わりに
動作としては非常にシンプルですが、発想が独特で知らないと独自の四捨五入を実装しがちです。四捨五入を実装しそうになったらこの記事を思い出してください。きっと実装せずに済むはずです。