117

JavaScript では、数値を小数点以下 N 桁に丸める一般的な方法は次のようになります。

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

console.log(roundNumber(0.1 + 0.2, 2));
console.log(roundNumber(2.1234, 2));

ただし、このアプローチでは、小数点以下最大N 桁まで丸められますが、常に小数点以下 N 桁まで丸めたいと考えています。たとえば、「2.0」は「2」に丸められます。

何か案は?

4

9 に答える 9

266

ここで示したすべてに対して、より単純なアプローチがあると思います。これはNumber.toFixed()、JavaScriptですでに実装されているメソッドです。

単に書く:

var myNumber = 2;

myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"

等...

于 2011-08-18T07:08:50.193 に答える
52

私は方法を発見しました。これは、修正を加えた Christoph のコードです。

function toFixed(value, precision) {
    var precision = precision || 0,
        power = Math.pow(10, precision),
        absValue = Math.abs(Math.round(value * power)),
        result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));

    if (precision > 0) {
        var fraction = String(absValue % power),
            padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
        result += '.' + padding + fraction;
    }
    return result;
}

「+ 1」を追加した理由に興味がある場合は、ここで配列コンストラクターを使用して文字を繰り返す方法の詳細をお読みください。

于 2010-05-25T23:34:50.660 に答える
26

これは丸めの問題ではなく、表示の問題です。数値には、有効桁数に関する情報は含まれていません。値 2 は 2.0000000000000 と同じです。丸められた値を文字列に変換すると、特定の桁数が表示されます。

次のように、数字の後にゼロを追加するだけです。

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';

(これは、クライアントの地域設定がピリオドを小数点記号として使用していることを前提としているため、他の設定を機能させるにはコードにさらに作業が必要であることに注意してください。)

于 2010-02-08T11:27:23.640 に答える
18

物事を行うためのより良い方法は常にあります。

var number = 51.93999999999761;

4 桁の精度を取得したい: 51.94

ただ行う:

number.toPrecision(4);

結果は次のようになります: 51.94

于 2012-11-16T17:04:05.300 に答える
6

PHP ライクな丸め方法

以下のコードを使用して、独自のバージョンの Math.round を独自の名前空間に追加することができます。これは、精度パラメーターを受け取ります。上記の例の小数丸めとは異なり、これは文字列との間の変換を実行しません。精度パラメータは PHP や Excel と同じように機能し、正の 1 は小数点第 1 位に丸められ、-1 は小数第 1 位に丸められます。

var myNamespace = {};
myNamespace.round = function(number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230

Math.round() の Mozilla 開発者リファレンスから

于 2016-08-16T09:02:50.733 に答える
2

うまくいけば、コードが機能します(あまりテストを行いませんでした):

function toFixed(value, precision) {
    var precision = precision || 0,
        neg = value < 0,
        power = Math.pow(10, precision),
        value = Math.round(value * power),
        integral = String((neg ? Math.ceil : Math.floor)(value / power)),
        fraction = String((neg ? -value : value) % power),
        padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');

    return precision ? integral + '.' +  padding + fraction : integral;
}
于 2010-02-08T11:48:37.773 に答える