イントロダクション
記事「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
有効数字 - Wikipediahttp://ja.wikipedia.org/wiki/%E6%9C%89%E5%8A%B9%E6%95%B0%E5%AD%97
3
Number.prototype.toPrecision() - JavaScript | MDNhttps://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision
 
コメントを投稿 (ここをクリックしてコメント投稿フォームを表示)
コメント投稿機能について