2

計算された値 (非常に小さいものから非常に大きいものまで) を取り、それを小数点以下の桁数に丸めて表示する関数が必要です。小数点以下の桁数は入力の大きさに依存する必要があるため、不明な.toFixed(n)ためなどは使用できません。n

私は次のことを思いつきましたが、これを行うにはもっと良い方法があると感じています。

function format_output(output) {
    if (output > 10000) {
        output = output.toFixed(0);
} else {
        if (output > 100 && output < 10000) {
        output = output.toFixed(1);
    } else {
            if (output>1 && output <100) {
                output = output.toFixed(3);
    } else {
        // repeat as necessary
    }
return output;
}

ありがとう!

4

4 に答える 4

4

これを約 5 桁の精度に制限したいようです。これはより明示的にそうするかもしれません:

var toPrecision = function(precision) {
    return function(nbr) {
        if (typeof nbr !== 'number') return 0; //???
        if (nbr === 0) return 0;
        var abs = Math.abs(nbr);
        var sign = nbr / abs;
        nbr = abs;
        var digits = Math.ceil(Math.log(nbr)/Math.LN10);
        var factor = Math.pow(10, precision - digits);
        var result = nbr * factor;
        result = Math.round(result, 0);
        return result / factor;
    };
};

var format_output = toPrecision(5);

format_output(1234567.89012); // 1234600
format_output(987.654321); // 987.65
format_output(-.00246813579); // -0.0024681

もちろん、必要に応じて、これらを 2 つの引数の関数に組み合わせることができます。

var toPrecision = function(nbr, precision) {
    if (typeof nbr !== 'number') return 0; //???
    if (nbr === 0) return 0;
    var abs = Math.abs(nbr);
    var sign = nbr / abs;
    nbr = abs;
    var digits = Math.ceil(Math.log(nbr)/Math.LN10);
    var factor = Math.pow(10, precision - digits);
    var result = nbr * factor;
    result = Math.round(result, 0);
    return result / factor;
};

toPrecision(1234567.89012, 5); // 1234600

または、ボートが浮く場合は、それを Math オブジェクトにアタッチできます。

Math.toPrecision = function(nbr, precision) {
    // ...
}

更新(2020年5月)

何年も後、ES6 が普及したことで、私はこれを別の方法で書きました。次のようになります。

var toPrecision = (precision) => (nbr, _, __, powerOf10) => 
  nbr === 0
    ? 0
    : (
        powerOf10 = 10 ** (precision - Math .ceil (Math .log10 (Math .abs (nbr)))), 
        Math .round (nbr * powerOf10) / powerOf10
      )
于 2013-03-04T13:20:02.877 に答える
1

あなたの要件については、科学表記法を調べる必要があります

output.toExponential();

科学表記法を使用したくない場合は、代わりにこれを試してください。

function format_output(output) {
    var n =  Math.log(output) / Math.LN10;
    var x = 4-n;
    if(x<0)
        x=0;
    output = output.toFixed(x);
    return output;
}
于 2013-03-04T12:46:07.687 に答える
0

値を有効数字 5 桁に制限したいようです。以下は、限られた範囲の値 (99999 か​​ら 0.00001) に対して実行します。一部の古いブラウザでは、一部の値に対して丸め誤差が発生する可能性があることに注意してください。

  <input onchange="
    var bits = this.value.split('.');
    var places = 5 - bits[0].length;

    if (places < 0) {
      places = 0;

    } else if (bits[0] == 0) {
      places = 5;
    }
    this.value = Number(this.value).toFixed(places); 
  ">
于 2013-03-04T12:59:54.637 に答える