日々のコンピュータ情報の集積と整理

Dr.ウーパのコンピュータ備忘録

2014年5月29日木曜日

JavaScriptで数値の有効桁数を計算するコードを作ってみました

イントロダクション

記事「HTMLとJavaScriptで単純なアニメーション付きの横向き棒グラフを作成する-アニメーションパターン:増加割合固定」にて、グラフ上に表示する数値の有効桁数の計算のために、数値の有効桁数を計算するコードを作ってみました。


有効桁数とは

信頼できる数値の桁数のことを”有効桁数”といいます。(参考文献1)


いくつか例を挙げて説明します。

数値が 1.23 の場合、有効桁数は 3 桁です。
それは、"1.23" の 3 桁分の数値は信頼できるものですが、1.23 の次には何が来るかわかりません。つまり、有効桁数は 4 桁はないということです。

数値が 0.01 の場合、有効桁数は 1 桁です。
それは、0.01 の次には何が来るのかわからないからです。
0.01 と記載されていると、有効桁数が 3 桁あるように見えてしまうかもしれませんが、0.0 の部分はあくまで値の大きさを表しているだけだからです。

数値が 10.00 の場合、有効桁数は 4 桁です。
これは、10.00 という表記により、1 の次に 3 つ分の 0 があるということを明示的に示しているためです。

数値が 1000 の場合、有効桁数は 1桁~4桁のどれなのかわかりません。
この問題に対処するために、表記としては、
 1000.
とすることで、有効桁数が 4 桁あることを明示しています。(参考文献2)
もしくは、指数形式で表示することで、有効桁数を明示することもできます。
 1e3 -> 有効桁数は 1 桁
 1.0e3 -> 有効桁数は 2 桁
 1.00e3 -> 有効桁数は 3 桁
 1.000e3 -> 有効桁数は 4 桁


以上を踏まえて、JavaScript で数値の有効桁数を計算するコードを作ってみました。
(JavaScript には指定した有効桁数で数値を文字列に変換するメソッド Number.prototype.toPrecision() がありますが、数値の有効桁数を取得するメソッドは見当たらなかったので、今回自作した次第です。)(参考文献3)

コード

以下のメソッド getSignificantFigures にて、数値を文字列として引数に渡すと、その数値の有効桁数を計算します。

    /*
     数値の有効桁数を取得する

      str : 10進の数値を保持したテキスト
    */
    function getSignificantFigures(str) {

        // 不要な文字を消す(符号)
        str = str.replace(/[+-]/g, "");

        // 数値の終わりの 0 の列を消す
        //   1000 の場合 000 を消す
        //   1.000 の場合 000 は消さない
        if (!(/^\d*\./.test(str))) {
            str = str.replace(/0+$/g, "");
        }

        // 小数点を消す
        str = str.replace(/\./g, "");

        // 数値の先頭の 0 の列を消す
        str = str.replace(/^0+/g, "");

        // 指数形式の指数部を消す
        str = str.replace(/[eE]\d+/g, "");

        return str.length;
    }


行っていることは、正規表現にて、有効桁数ではない部分を削除しています。
そして、最後には有効桁数の部分のみになるので、その部分の長さを返却しています。

結果

以下のテスト用コードを実行し、有効桁数を求めてみました。

テスト用コード

    var str = "";

    str = "1.23";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");

    str = "0.01";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");

    str = "10.00";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");

    str = "1000.";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");

    str = "1e3";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");

    str = "1.0e3";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");

    str = "1.00e3";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");

    str = "1.000e3";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");

    str = "+1.000e-3";
    document.writeln(str + " の有効桁数:" + getSignificantFigures(str) + " 桁<br />");


実行結果

1.23 の有効桁数:3 桁
0.01 の有効桁数:1 桁
10.00 の有効桁数:4 桁
1000. の有効桁数:4 桁
1e3 の有効桁数:1 桁
1.0e3 の有効桁数:2 桁
1.00e3 の有効桁数:3 桁
1.000e3 の有効桁数:4 桁
+1.000e-3 の有効桁数:4 桁


以上より、正しく数値の有効桁数を計算出来ていることがわかります。

なお、いかに上記メソッドを使用して、試しに計算できるテキストボックスを設置したので、使ってみてください。

有効桁数を計算したい数値を入力:



参考文献

1

有効数字(有効桁数)
http://fnorio.com/0034significant_figure1/significant_figure.htm

2

有効数字 - Wikipedia
http://ja.wikipedia.org/wiki/%E6%9C%89%E5%8A%B9%E6%95%B0%E5%AD%97

3

Number.prototype.toPrecision() - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision







関連記事

関連記事を読み込み中...

同じラベルの記事を読み込み中...