JavaScriptで数値を丸めるにはどうすればよいですか?
-
05-07-2019 - |
質問
プロジェクトに取り組んでいるときに、元従業員が作成した、基本的に次の形式のレポートを作成するJSスクリプトに出会いました
Name : Value
Name2 : Value2
etc。
問題は、値が浮動小数点数(精度が異なる)、整数、または 2.20011E + 17
の形式になることもあるということです。出力したいのは純粋な整数です。ただし、JavaScriptについてはあまり知りません。これらの時々浮動小数点数を取り、整数にするメソッドをどのように書きますか?
解決
入力を数値に変換してから丸める必要があります:
function toInteger(number){
return Math.round( // round to nearest integer
Number(number) // type cast your input
);
};
または1つのライナーとして:
function toInt(n){ return Math.round(Number(n)); };
異なる値でのテスト:
toInteger(2.5); // 3
toInteger(1000); // 1000
toInteger("12345.12345"); // 12345
toInteger("2.20011E+17"); // 220011000000000000
他のヒント
特定の桁数に丸める必要がある場合は、次の関数を使用します
function roundNumber(number, digits) {
var multiple = Math.pow(10, digits);
var rndedNum = Math.round(number * multiple) / multiple;
return rndedNum;
}
ECMAScript仕様によると、JavaScriptの数字は表されます。倍精度64ビット形式IEEE 754によってのみ。したがって、JavaScriptには実際には整数型はありません。
これらの数値の丸めに関して、これを達成する方法はいくつかあります。 Math オブジェクトは、使用できる3つの丸め方法を提供します。
Math.round()が最も一般的に使用されています、最も近い整数に丸められた値を返します。次に、 Math.floor()が最大値を返します。数値以下の整数。最後に、 Math.ceil()関数を使用して、数値以上の最小整数。
toFixed()もあります。固定小数点表記を使用して数値を表す文字列。
Ps .: Math.round()メソッドには 2番目の引数はありません。 toFixed()は IE固有ではありません、 ECMAScript仕様内にも
2番目の引数(丸めのための小数の数)で Math.round()
を使用できるようにする方法は次のとおりです。
// 'improve' Math.round() to support a second argument
var _round = Math.round;
Math.round = function(number, decimals /* optional, default 0 */)
{
if (arguments.length == 1)
return _round(number);
var multiplier = Math.pow(10, decimals);
return _round(number * multiplier) / multiplier;
}
// examples
Math.round('123.4567', 2); // => 123.46
Math.round('123.4567'); // => 123
toFixed(x)
または toPrecision(x)
も使用できます。 x は桁数です。
これらのメソッドは、すべての主要なブラウザーでサポートされています
Math.round()を使用して、数値を最も近い整数に丸めることができます。
Math.round(532.24) => 532
また、 parseInt()および parseFloat()を使用して、変数を特定の型(この場合は整数と浮動小数点)にキャストします。
丸めのための非常に良い近似:
function Rounding (number, precision){
var newNumber;
var sNumber = number.toString();
var increase = precision + sNumber.length - sNumber.indexOf('.') + 1;
if (number < 0)
newNumber = (number - 5 * Math.pow(10,-increase));
else
newNumber = (number + 5 * Math.pow(10,-increase));
var multiple = Math.pow(10,precision);
return Math.round(newNumber * multiple)/multiple;
}
数字の小数部分の長さが非常に長い場合にのみ、正しくありません。
Math.floor(19.5)= 19も動作するはずです。