私が書いているスクリプトの場合、丸められた数値を表示する必要がありますが、小数やそれ以降の数値は表示されません。 3位に丸めることになりましたが、JavaScriptに_のようなsubstr
関数があるとは思えないため、小数点以下をすべて削除する方法がわかりません。PHPします。
推奨事項はありますか?
文字列がある場合、整数として解析します。
var num = '20.536';
var result = parseInt(num, 10); // 20
数字を持っている場合、ECMAScript 6はMath.trunc
を提供し、Firefox 24以降とEdgeですでに利用可能な完全に一貫した切り捨てを行います。
var num = -2147483649.536;
var result = Math.trunc(num); // -2147483649
それに頼ることができず、常に正の数を持っている場合は、もちろんMath.floor
を使用できます:
var num = 20.536;
var result = Math.floor(num); // 20
最後に、[-2147483648、2147483647]に数値がある場合、ビット演算子を使用して32ビットに切り捨てることができます。 | 0
は一般的であり、>>> 0
を使用して符号なし32ビット整数を取得できます。
var num = -20.536;
var result = num | 0; // -20
JavaScriptが科学表記法で非常に小さいまたは非常に大きい浮動小数点数を表す方法を考慮すると、travis Pessettoの答えとmozeyのtrunc2
関数が唯一の正しい答えでした。
たとえば、parseInt(-2.2043642353916286e-15)
はその入力を正しく解析しません。 0
を返す代わりに、-2
を返します。
これはそれを行う正しい(そして最も狂気のない)方法です:
function truncate(number)
{
return number > 0
? Math.floor(number)
: Math.ceil(number);
}
ここにソリューションを追加します。値が0より大きい場合はfloorを、ゼロより小さい場合はceilを使用できます。
function truncateToInt(x)
{
if(x > 0)
{
return Math.floor(x);
}
else
{
return Math.ceil(x);
}
}
次に:
y = truncateToInt(2.9999); // results in 2
y = truncateToInt(-3.118); //results in -3
数値を文字列に変換し、小数点以下をすべて捨てます。
trunc = function(n) { return Number(String(n).replace(/\..*/, "")) }
trunc(-1.5) === -1
trunc(1.5) === 1
2013-07-10を編集
ミニテックが指摘したように、2番目に考えたとき、ストリング方式は少し過剰に思えます。したがって、ここと他の場所にリストされているさまざまな方法を比較します。
function trunc1(n){ return parseInt(n, 10); }
function trunc2(n){ return n - n % 1; }
function trunc3(n) { return Math[n > 0 ? "floor" : "ceil"](n); }
function trunc4(n) { return Number(String(n).replace(/\..*/, "")); }
function getRandomNumber() { return Math.random() * 10; }
function test(func, desc) {
var t1, t2;
var ave = 0;
for (var k = 0; k < 10; k++) {
t1 = new Date().getTime();
for (var i = 0; i < 1000000; i++) {
window[func](getRandomNumber());
}
t2 = new Date().getTime();
ave += t2 - t1;
}
console.info(desc + " => " + (ave / 10));
}
test("trunc1", "parseInt");
test("trunc2", "mod");
test("trunc3", "Math");
test("trunc4", "String");
結果は、ハードウェアによって異なる場合がありますが、次のとおりです。
parseInt => 258.7
mod => 246.2
Math => 243.8
String => 1373.1
Math.floor/ceilメソッドは、parseIntやmodよりもわずかに高速です。文字列は、他のメソッドと比較してパフォーマンスが低下します。
Math.trunc()関数は、すべての小数桁を削除します。
正の数の場合、Math.floor()とまったく同じように動作します。
console.log(Math.trunc(89.13349)); // output is 89
負の数の場合、Math.ceil()と同じように動作します。
console.log(Math.trunc(-89.13349)); //output is -89