2012-04-14 30 views
51

私が書いているスクリプトでは、丸められた数字を表示する必要がありますが、小数点以下の数字は表示されません。私は3位に丸めてしまったが、JavaScriptのようにPHPのようにsubstrの機能がないように、小数点以下を削除する方法についてはわからない。JavaScriptの整数を切り捨てるか丸めますか?

推奨事項

+2

丸めおよび切り捨ては2つの異なる動作です。あなたはどちらをしようとしていますか? –

+0

'.substring()'は絶対にjavascriptの関数です。 –

+2

**メソッドは '.toFixed()'と呼び出されます** – neaumusic

答えて

96

あなたは文字列を持っている場合は、整数としてそれを解析:それ以外の場合は

var num = '20.536'; 
var result = parseInt(num, 10); // 20 

、ECMAScriptの6 24+ Firefoxで、すでに利用可能な完全に一致切り捨てのための申し出Math.truncとエッジ:

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 
+6

Math.floor()は負の数に対して間違った結果を返します。より良い選択肢については、下記のmozeyの答えを考えてください。 –

+0

@JonBrooks:ありがとうございますが、まずは 'parseInt'をお勧めします。ゆっくりと複雑な選択肢に対するmozeyの答えを考えてみましょう。 – Ryan

+2

mozeyの 'trunc2'は実際には正しいオプションですが、' parseInt'よりもはるかに速くなる文字列解析ではなく整数比較を使用し、常に正しい結果を返します。 – BlinkyTop

2

使用Math.floor()を:

var f = 20.536; 
var i = Math.floor(f); // 20 

http://jsfiddle.net/J4UVV/1/

+1

負の数を-20.536とすると、切り捨てに間違った結果が得られます。-21 http://jsfiddle.net/zL1v5e2k/ –

8

数値を文字列に変換し、すべてのものを捨てます小数点の後に。

trunc = function(n) { return Number(String(n).replace(/\..*/, "")) } 

trunc(-1.5) === -1 

trunc(1.5) === 1 

編集2013年7月10日

としてはminitechで指摘し、第二に、文字列の方法は少し過剰に思えるんと思いました。そうここにリストされている様々な方法の比較:以下のようにハードウェアに基づいて変化し得る結果は、

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。文字列は、他のメソッドと比較してパフォーマンスが低くなります。

+0

'parseInt'となり、文字列置換は999999999999999900000. – Ryan

+0

パフォーマンスが大きな問題でなければ、簡単にするために 'parseInt'を使用してください。そうでない場合は' trunc3() 'を実装してください。 – RozzA

12

ここに私の解決策を追加します。値が0とはceilを超えているとき、彼らはゼロ未満のとき、私たちは床を使用することができます。

function truncateToInt(x) 
{ 
    if(x > 0) 
    { 
     return Math.floor(x); 
    } 
    else 
    { 
     return Math.ceil(x); 
    } 
} 

その後:mozeyのtrunc2機能とともに

y = truncateToInt(2.9999); // results in 2 
y = truncateToInt(-3.118); //results in -3 
+2

なぜこの回答がダウンしたのか分かりません。唯一正しい方法です! – BlinkyTop

15

トラヴィスPessettoの答えはどのように考えると、唯一の正解でしたJavaScriptは、科学記法では非常に小さいか非常に大きな浮動小数点数を表します。

たとえば、parseInt(-2.2043642353916286e-15)は、その入力を正しく解析しません。0を返す代わりに、-2を返します。

これはそれを行うには正しい(且つ少なくとも非常識私見)の方法である:

function truncate(number) 
{ 
    return number > 0 
     ? Math.floor(number) 
     : Math.ceil(number); 
} 
+0

私の場合、Math.trunc(-2.2043642353916286e-15)はゼロを返します。私はhttps://www.typescriptlang.org/play/でテストしました。 – Devid

関連する問題