次の JavaScript 構文があります。
var discount = Math.round(100 - (price / listprice) * 100);
これは整数に切り上げられます。小数点以下 2 桁で結果を返すにはどうすればよいでしょうか?
ベストアンサー1
注 - 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 つの小さな変更が必要です。上にリンクされている回答の関数は、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 - あなたたちは私を殺しに来ます。編集 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;
}