JavaScript:丸い数字をn小数にフォーマットします
-
19-09-2019 - |
質問
JavaScriptでは、数字をn 10桁に丸めて次のようなものです。
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));
ただし、このアプローチはaに丸められます 最大 私が望んでいる間、小数点以下の場所の いつも n 10桁までの丸い場所。たとえば、「2.0」は「2」に丸められます。
何か案は?
解決
それは丸みを帯びた問題ではなく、ディスプレイの問題です。数字には、かなりの数字に関する情報が含まれていません。値2は2.0000000000000と同じです。丸い値を文字列に変えると、一定数の数字を表示します。
数字の後にゼロを追加するだけで、次のようなものがあります。
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
(これは、クライアントの地域設定が小数のセパレーターとして期間を使用することを前提としていることに注意してください。コードは他の設定で機能するためにさらに作業を必要とします。)
他のヒント
ここに与えられたすべての人にもっと簡単なアプローチがあり、方法だと思います。 Number.toFixed()
JavaScriptに既に実装されています。
簡単に書く:
var myNumber = 2;
myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
等...
私は方法を発見しました。これは、修正を伴うクリストフのコードです。
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」を追加した理由について興味がある場合。
物事をするためのより良い方法は常にあります。
var number = 51.93999999999761;
4桁の精度を取得したい:51.94
ただしてください:
number.toPrecision(4);
結果は次のとおりです。51.94
PHPのような丸め方法
以下のコードを使用して、独自のバージョンのmath.roundを独自の名前空間に追加することができます。上記の例の小数の丸めとは異なり、これは文字列との間の変換を実行せず、PHPとExcelと同じように精密パラメーターは動作し、ポジティブ1が1桁まで丸くなり、10桁が10桁丸くなります。
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
うまくいけば、動作するコード(あまりテストしませんでした):
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;
}
これは、n桁を丸くするために機能します(n桁に切り捨てたい場合は、math.round呼び出しを削除し、math.trunc oneを使用します):
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);
}
JavaScriptSprintfへのリンクは次のとおりです。
http://www.webtoolkit.info/javascript-sprintf.html
Sprintf()への呼び出しは、Perlの1つの丸め方法ですが、JavaScriptはその機能をネイティブに持っていません。
http://perldoc.perl.org/functions/sprintf.html
それは助けますか?
以下の機能が役立つと思います
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
丸めを本当に気にしない場合は、トフィックス(x)を追加してから、必要に応じてトレーリング0ESとドットを削除します。それは高速な解決策ではありません。
function format(value, decimals) {
if (value) {
value = value.toFixed(decimals);
} else {
value = "0";
}
if (value.indexOf(".") < 0) { value += "."; }
var dotIdx = value.indexOf(".");
while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's
return value;
}