1. ホーム
  2. javascript

[解決済み] JavaScriptの計算、小数点以下2桁に丸める [重複]。

2022-03-21 21:55:04

質問

次のようなJavaScriptの構文があります。

var discount = Math.round(100 - (price / listprice) * 100);

これは整数に切り上げられます。小数点以下2桁の結果を返すにはどうしたらよいでしょうか?

どのように解決するのですか?

注 - 3桁の精度が重要な場合は、編集4章を参照してください。

var discount = (price / listprice).toFixed(2);

toFixed は、小数点以下2桁以上の値に応じて、切り上げまたは切り下げを行います。

http://jsfiddle.net/calder12/tv9HY/

ドキュメンテーション https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

編集 - 他の方もおっしゃっているように、これは結果を文字列に変換してしまいます。これを避けるには

var discount = +((price / listprice).toFixed(2));

編集2 - コメントにもあるように、この関数はいくつかの精度で失敗します。例えば1.005の場合、1.01ではなく1.00を返します。もし、この程度の精度が重要であれば、私はこの答えを見つけました。 https://stackoverflow.com/a/32605063/1726511 私が試したすべてのテストでうまく機能しているようです。

例えば、99.004は99.00ではなく99を返すので、価格を表示するのには理想的ではありません。

編集3 - 実際のリターンにtoFixedがあることで、まだいくつかの数値が狂っていたようです。この最終編集でうまくいくようです。いやはや、何度も作り直したものです。

var discount = roundTo((price / listprice), 2);

function roundTo(n, digits) {
  if (digits === undefined) {
    digits = 0;
  }

  var multiplicator = Math.pow(10, digits);
  n = parseFloat((n * multiplicator).toFixed(11));
  var test =(Math.round(n) / multiplicator);
  return +(test.toFixed(digits));
}

Fiddleの例はこちら。 https://jsfiddle.net/calder12/3Lbhfy5s/

4を編集 - お前らに殺される。編集3は負の数で失敗しました。なぜ負の数を正にしてから丸めを行い、結果を返す前に正に戻す方が簡単なのかを掘り下げることなくです。

function roundTo(n, digits) {
    var negative = false;
    if (digits === undefined) {
        digits = 0;
    }
    if (n < 0) {
        negative = true;
        n = n * -1;
    }
    var multiplicator = Math.pow(10, digits);
    n = parseFloat((n * multiplicator).toFixed(11));
    n = (Math.round(n) / multiplicator).toFixed(digits);
    if (negative) {
        n = (n * -1).toFixed(digits);
    }
    return n;
}

フィドル https://jsfiddle.net/3Lbhfy5s/79/