web-dev-qa-db-ja.com

JavaScriptの数学、小数点第2位を四捨五入

私は以下のJavaScriptシンタックスを持っています。

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

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

353
Smudger

注 - 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 これは私が試したすべてのテストでうまくいくようです。

ただし、小さな変更が1つ必要です。上のリンクの答えの関数は、四捨五入すると整数を返すため、たとえば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 - あなたたちは私を殺している。四捨五入をする前に負の数を正にしてから結果を返す前に負の数を正すことに対処するほうが簡単な理由を掘り下げることなしに、Edit 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(2);
    if( negative ) {    
        n = (n * -1).toFixed(2);
    }
    return n;
}

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

677
Rick Calder

MDNで文書化されているように、単項プラスを使用して文字列を数値 に変換する場合

例えば、次のとおりです。+discount.toFixed(2)

121
John Gietzen

関数Math.round()と.toFixed()は最も近い整数に丸めることを意図しています。小数を扱い、Math.round()に "multiply and divide"メソッド、または.toFixed()にパラメータを使用すると、間違った結果が得られます。たとえば、Math.round(1.005 * 100)/ 100を使用して1.005を四捨五入しようとすると、1の結果が得られ、1.01の正解ではなく.toFixed(2)を使用して1.00が得られます。

あなたはこの問題を解決するために以下を使うことができます:

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2');

必要な小数点以下2桁を取得するには、.toFixed(2)を追加します。

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2').toFixed(2);

四捨五入を処理する関数を作ることができます。

function round(value, decimals) {
    return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals);
}

例: https://jsfiddle.net/k5tpq3pd/36/

代替

Prototypeを使ってNumberにround関数を追加することができます。 numberではなく文字列を返すので、ここに.toFixed()を追加することはお勧めしません。

Number.prototype.round = function(decimals) {
    return Number((Math.round(this + "e" + decimals)  + "e-" + decimals));
}

そしてこれを次のように使います。

var numberToRound = 100 - (price / listprice) * 100;
numberToRound.round(2);
numberToRound.round(2).toFixed(2); //Converts it to string with two decimals

https://jsfiddle.net/k5tpq3pd/35/

ソース: http://www.jacklmoore.com/notes/rounding-in-javascript/ /

40

小数点以下2桁で結果を得るには、次のようにします。

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

四捨五入される値は、最初の2桁を保持するために100倍され、実際の結果を得るために100で割られます。

29
Cattode

discount.toFixed(2);を使ってみてください

14
Harish

私が見つけた最も簡単で簡単な解決策は

function round(value, decimals) {
 return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}   
round(1.005, 2); // 1.01
11

私がしたことを私が見た最善の方法は10で桁数のべき乗を掛け、それからMath.roundをし、そして最後に10で桁のべき乗で割ることであると思う。これが私がTypeScriptで使う簡単な関数です:

function roundToXDigits(value: number, digits: number) {
    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);
    return value;
}

またはプレーンなJavaScript:

function roundToXDigits(value, digits) {
    if(!digits){
        digits = 2;
    }
    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);
    return value;
}
10
Bryce

受け入れられた答えの小さな変化。 toFixed(2)は文字列を返すので、常に小数点以下2桁まで表示されます。これらはゼロかもしれません。あなたが最後のゼロを抑制したいならば、単にこれをしてください:

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

編集:私は、Firefox 35.0.1のバグと思われるものを発見したところです。つまり、上記のものはNaNにいくつかの値を与える可能性があります。
コードをに変更しました

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

これは小数点以下2桁までの数を与えます。もし3つが欲しいなら、1000で掛け算してください。
OPは常に小数点以下2桁が必要ですが、FirefoxでtoFixed()が壊れている場合は、最初に修正する必要があります。
https://bugzilla.mozilla.org/show_bug.cgi?id=1134388 を参照してください。

7
HalfTitle

最速の方法 - toFixed()より速い

2つの10進数

x      = .123456
result = Math.round(x * 100) / 100  // result .12

3つの10進数

x      = .123456
result = Math.round(x * 1000) / 1000      // result .123
5
Kamy D
    function round(num,dec)
    {
      num = Math.round(num+'e'+dec)
      return Number(num+'e-'+dec)
    }
      //Round to a decimal of your choosing:
    round(1.3453,2)
2
Chris Martin

小数点以下の桁数への丸めを処理するには、2行のコードを持つ関数でほとんどのニーズに対応できます。ここにいくつかのサンプルコードがあります。



    var testNum = 134.9567654;
    var decPl = 2;
    var testRes = roundDec(testNum,decPl);  
    alert (testNum + ' rounded to ' + decPl + ' decimal places is ' + testRes);

    function roundDec(nbr,dec_places){
        var mult = Math.pow(10,dec_places);
        return Math.round(nbr * mult) / mult;
    }

0
user3232196
function discoverOriginalPrice(discountedPrice, salePercentage) {
  var originalPrice = discountedPrice / (1 - (salePercentage * .01));
  return +originalPrice.toFixed(2);
}
0
James Kip