web-dev-qa-db-ja.com

Javascript:丸められた数値をN桁にフォーマット

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」に丸められます。

何か案は?

96
hoju

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

次のように、数字の後にゼロを追加できます。

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

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

22
Guffa

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

単に書く:

var myNumber = 2;

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

等...

224
David

私は方法を発見しました。これは、修正済みの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;
}

配列コンストラクターを使用して文字を繰り返す方法の詳細を読んでください here なぜ "+ 1"を追加したのか興味があるなら。

48
Elias Zamaria

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

var number = 51.93999999999761;

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

ただやる:

number.toPrecision(4);

結果は51.94になります

15
de.la.ru

PHPのような丸め方法

次のコードを使用して、Math.roundの独自のバージョンを、精度パラメーターを受け取る独自のネームスペースに追加できます。上記の例の10進数の丸めとは異なり、これは文字列との変換を行わず、精度パラメーターはPHPおよびExcelと同じように機能し、正の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

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

5
JohnnyBizzle

うまくいけば、動作するコード(多くのテストを行わなかった):

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;
}
2
Christoph

これは、N桁に丸める場合に機能します(N桁に切り捨てる場合は、Math.round呼び出しを削除してMath.truncを使用します)。

function roundN(value, digits) {
   var tenToN = 10 ** digits;
   return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}

過去にJavaでそのようなロジックに頼らなければならなかったのは、オーサリング時に データ操作E-Slateコンポーネント でした。それは、0.1を0に何度も追加すると、予期せずに長い小数部分になることがわかったためです(これは浮動小数点演算によるものです)。

常に小数点以下2桁を表示するように数値をフォーマットする のユーザーコメントは、この手法のスケーリングを呼び出します。

期待どおりに丸められないケースがあるという言及もありますが、代わりに http://www.jacklmoore.com/notes/rounding-in-javascript/ をお勧めします:

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

以下の機能が役立つと思います

function roundOff(value,round) {
   return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}

使用法:roundOff(600.23458,2);600.23を返します

0
KRISHNA TEJA

Javascript sprintfへのリンクは次のとおりです。

http://www.webtoolkit.info/javascript-sprintf.html

Sprintf()の呼び出しはPerlの丸め方法の1つですが、javascriptにはネイティブにその機能がありません。

http://perldoc.Perl.org/functions/sprintf.html

それは役立ちますか?

0
Paul