6

JavaScript を使用してオンライン計算機を作成しています。

私は計算を行うためにこれを持っています:

eval(expression).toPrecision(10);

これにより、ほとんどすべての場合に適切な出力が生成されます。例えば

eval('456456+45646486*45646884').toPrecision(10)
// Output: "2.083619852e+15"

eval('1/0').toPrecision(10)
// Output: "Infinity"

でも

eval('4*1').toPrecision(10)
// Output: "4.000000000"

末尾のゼロをトリミングするだけでなく、出力を上に維持するにはどうすればよいですか?

4

3 に答える 3

18

toPrecision を使用した後、1 で割ります。Javascript はゼロを追跡し、正規表現は必要ありません。

于 2015-07-09T18:13:31.000 に答える
3

次の呼び出しは、すべての末尾の s と末尾のreplace()を置き換えます(存在する場合)。0.

eval(expression).toPrecision(10).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1")

それはどのように機能しますか?

/(?:\.0+|(\.\d+?)0+)$/\.0+または(\.\d+?)0+文字列の末尾 ( ) を探します$は、 「キャプチャ」されるの?:を防ぎます。\.0+|(\.\d+?)0+

\.0+.の後に任意の数の0sが続くものと一致します。

(\.\d+?)0+が一致.し、その後に少なくとも 1 つの数字が続き、その後に少なくとも 1 つの0. は、 ができるだけ多くの に一致?するようにします。括弧は非sを「キャプチャ」します。0+00

の 2 番目のパラメーターreplace()は、一致したものを置き換える新しい文字列です。は$1並べ替えの変数でありreplace()、一致した値を最初にキャプチャされた値に置き換えるように指示します (1は の後だったため$)。この場合、最初に取得された値は\.\d+?一致したものです。

したがって、最後に:

  1. .任意の数の s が続く0と破棄されます
  2. .その後に非0s が続き、その後に0s が続くと、0s は破棄されます

、 、および12、および3の精度のメソッドの比較については、以下を参照してください。各グループの最初 (太字) の項目がこのメソッドです。赤い項目は、期待に合わないものです。.40*14*140*1

var tests = [
  '.04*1',
  '.40*1',
  '4*1',
  '40*1'
];
var results = {};
for (var i = 0; i < tests.length; i += 1) {
  results[i] = {};
  for (var p = 1; p < 3; p += 1) {
    results[i][p] = {};
    results[i][p][0] = {
      'output': eval(tests[i]).toPrecision(p).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1"),
      'regex': '/(?:\.0+|(\.\d+?)0+)$/, "$1"'
    };
    results[i][p][1] = {
      'output': eval(tests[i]).toPrecision(p).replace(/\.0+$/, ""),
      'regex': '/\.0+$/, ""'
    };
    results[i][p][2] = {
      'output': eval(tests[i]).toPrecision(p).replace(/\.([^0]+)0+$/, ".$1"),
      'regex': '/\.([^0]+)0+$/, ".$1"'
    };
    results[i][p][3] = {
      'output': eval(tests[i]).toPrecision(p).replace(/0+$/, ""),
      'regex': '/0+$/, ""'
    };
    results[i][p][4] = {
      'output': eval(tests[i]).toPrecision(p).replace(/\.?0+$/, ""),
      'regex': '/\.?0+$/, ""'
    };
  }
}
for (var i in results) {
  $("#result").append("<h1>" + tests[i] + "</h1>");
  for (var p in results[i]) {
    var expected = null;
    for (var t in results[i][p]) {
      var div = $("<div></div>");
      if (t == 0) {
        expected = results[i][p][t].output;
        div.addClass("expected");
      } else if (results[i][p][t].output !== expected) {
        div.addClass("invalid");
      }
      div.append("P" + p + ": " + results[i][p][t].output);
      div.append(" <small>" + results[i][p][t].regex + "</small>");
      $("#result").append(div);
    }
    $("#result").append("<br>");
  }
}
body { font-family: monospace; }
.expected { font-weight: bold; }
.invalid { color: red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="result"></div>

于 2014-11-07T21:35:19.427 に答える