数値に小数点以下の桁があるかどうか、または整数かどうかを確認します


284

(整数かどうかを判断するために)数値に小数位があるかどうかを確認する簡単な方法をJavaScriptで探しています。例えば、

23 -> OK
5 -> OK
3.5 -> not OK
34.345 -> not OK
if(number is integer) {...}

回答:


819

係数を使用するとうまくいきます:

num % 1 != 0
// 23 % 1 = 0
// 23.5 % 1 = 0.5

これは、数値に基づいていることに注意してくださいにかかわらず形式の、数。固定小数点付き整数を含む数値文字列を整数と同じように扱います。

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5

10
私は反対票を投じなかったが、それは20.0と関係があると言い、まだ小数点があり、上記を満たしています。とにかく私に何か新しいことを教えてくれた私からの+1 :)
Abe Petrillo

7
@阿部:十分そうですが、そうは思われません。20.0文字列で表現しない限り、プログラムで小数点があるかどうかを判断することはできません。また、他の解決策はどれも、それに取り組んでいないという理由で反対票を獲得しませんでした;-)
Andy E

1
@SREEP:上記のコメントを参照してください。数値として表される場合、JavaScriptでは0.00は0.00ではありません。文字列( "0.00")として表すことができます。その場合の質問は、「数値が整数であるかどうかを確認するではなく、文字列が整数であるかどうかを確認する」です。
アンディE

3
@Swanidhi:どういう意味ですか?何が無効になりますか?"10."全体の数であり、結果は全く同じになります"10"10
アンディE

3
OPは、NUMBERが整数であるかどうかの確認について尋ねます。彼はどこにも文字列について言及していません-その点では、アンディの答えは正しいです。
Om Shankar、

58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger()はES6標準の一部であり、IE11ではサポートされていません。

はfalseを返しNaNInfinity数値以外の引数x % 1 != 0はtrue を返します。


2
ソリューションが12.0に失敗する
Vikas Arora

@VikasAroraいいえ、意図したとおりに機能します。Number.isInteger(12.0)を返しますtrue
le_m

これは、正しい答えする必要がありますが、残念ながら、それは例えば、科学的表記法では動作しませんように思えるNumber.isInteger('1e3')あるfalseにもかかわらず、Number.isInteger(1e3)真実です。質問の意図が(表現に小数点が実際に存在するのではなく)非整数値を見つけることであるとすると、文字列値「12.0」整数を表すため、渡されますが、これもNumber.isInteger('12.0')ですfalse
brianmearns

@brianmearns OPの質問は、a numberが全体であるかどうかです。入力が文字列の場合は、もちろんそれをnumber最初の文字列に変換する必要がありますparseFloat()
le_m

47

または、これを使用して、それが小数でないかどうかを調べることもできます。

string.indexOf(".") == -1;

2
これはXX.0でも機能するため、これが実際の解決策だと思います
Deepankar Sarkar 14

5
続行する前に文字列に変換します。例: yournumber.toString.indexOf(".")
Daniel

1
francisco_ssb ..点記号はユニバーサルです...数学言語の小数点以下を表します..これはユニバーサルであり、どの国でも機能するはずです。あなたはカンマ(「 『)の話をする場合は、(』。 『)のポイントに変換しなければならないのindexOf前に(』。」)、明らかに...
ダニエル・大峯

1
ユーロが小数点の代わりにコンマを使用するため、彼はそれが一部の国では機能しないことを意味すると彼は通貨を参照していると思います。ただし、質問は通貨に固有のものではなく、小数点以下のみです...数値の端数のように。
テッサ

1
これは、decimalが1.00で、値を強制しない限りintにしたい場合は機能しません
simon-pr

21

最も一般的な解決策は、数値の整数部分を取り除き、次のようにゼロと比較することです。

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}

31
なぜstartVal != Math.floor(startVal)ですか?
アンディE

2
いいね。同じ概念ですが、あなたのバージョンはさらにきれいです。
Thomas

1
@Andy E:これは正の数に対してのみ可能です。負の数では機能しません..
Seeya K '25

3
@SeeyaK:もちろん負の数でも機能します。ぜひお試しください。
アンディE

1
@DeepakGoyal-これは仕様によるものです。このMath.Floor関数は10進数値を取り、JavaScriptで許可されている最大の10進数値は2^53 - 1または9007199254740991です。893144042145698745.3はこの最大値より大きいため、関数は失敗します。
トーマス

20

シンプルだが効果的!

Math.floor(number) === number;

4
@OmShankar効率的!=効果的
フィドル

Math.floor(3.0) == 3.0真である、Math.floor(3.3) == 3.3偽である
ローマー2018年

@フィドル、そうそう、それは私が言いたかったことです。これは、%modメソッドと比較してパフォーマンスがはるかに遅いため、効率的でありません。修正してくれてありがとう
Om Shankar

19

//それをバイト化するのはどうですか?

Number.prototype.isInt= function(){
 return this== this>> 0;
}

私はいつもJavaScriptのビット演算子に少し悪い気がします-

彼らはほとんど運動をしません。


14
>>値を符号付き32ビット整数に変換するため、2 ^ 31-1より大きい整数では失敗します。
Matthew Crumley、2010

1
@kennebec素晴らしかった-それは断然最も面白いソリューションです。そして、それはRegExよりはるかに優れています。
ダニエルB.チャップマン

5
number = 20.5

if (number == Math.floor(number)) {

alert("Integer")

} else {

alert("Decimal")

}

かなりクールで、XX.0のようなものでも動作します!Math.floor()が小数を持っている場合は小数を切り捨てるため、床が元の数値と異なる場合は小数であることがわかっているため、これは機能します!そして、文字列変換はありません:)



4

Number.isInteger()おそらく最も簡潔です。整数の場合はtrueを返し、そうでない場合はfalseを返します。


1
これは、文字列の問題のためにモジュラスを使用するよりも良いので、受け入れられる答えになるはずです。
Ini

3
function isDecimal(n){
    if(n == "")
        return false;

    var strCheck = "0123456789";
    var i;

    for(i in n){
        if(strCheck.indexOf(n[i]) == -1)
            return false;
    }
    return true;
}

説明は必要ありません。とても簡単です。
Grant Birchmeier、2014

1
文字列にstrCheckの値のいずれかが含まれている場合、それは10進数です...(ただし、。と。が欠落しています...
NicoJuicy

2
parseInt(num) === num

数値を渡すと、parseInt()その数値をintとして返します。

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true

4
私はこれが好きですが、特定のニーズに依存します。残念ながら、私はテストを失敗させる関数が必要ですparseInt(3.0) === 3.0 // true
zipzit

2

数値文字列を配列に変換し、小数点で分割します。次に、配列に値が1つしかない場合は、文字列に小数がないことを意味します。

if(!number.split(".")[1]){
    //do stuff
}

このようにして、整数と小数が実際に何であるかも知ることができます。より高度な例になります。

number_to_array = string.split(".");
inte = number_to_array[0];
dece = number_to_array[1]; 

if(!dece){
    //do stuff
}

1

これが私のガードライブラリからの抜粋です(David HermanによるEffective JavaScriptに触発されています):

var guard = {

    guard: function(x) {
        if (!this.test(x)) {
            throw new TypeError("expected " + this);
        }
    }

    // ...
};

// ...

var number = Object.create(guard);
number.test = function(x) {
    return typeof x === "number" || x instanceof Number;
};
number.toString = function() {
    return "number";
};


var uint32 = Object.create(guard);
uint32.test = function(x) {
    return typeof x === "number" && x === (x >>> 0);
};
uint32.toString = function() {
    return "uint32";
};


var decimal = Object.create(guard);
decimal.test = function(x) {
    return number.test(x) && !uint32.test(x);
};
decimal.toString = function() {
    return "decimal";
};


uint32.guard(1234);     // fine
uint32.guard(123.4);    // TypeError: expected uint32

decimal.guard(1234);    // TypeError: expected decimal
decimal.guard(123.4);   // fine

1

あなたはできる10を掛けた後、「やる剰余」操作/ divisonを10とし、その二つの操作の結果がゼロであるかどうかを確認します。その2つの演算の結果は、小数点の後の最初の桁を示します。結果がゼロの場合、数値は整数です。

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}


1

値を変更しないビット単位の演算(^ 0または~~)を使用して、小数部を切り捨て、丸めに使用できます。数値を丸めた後、元の値と比較されます。

function isDecimal(num) {
  return (num ^ 0) !== num;
}

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true


1

次の関数を使用して、数値に小数点以下の桁があるかどうかを確認できます。

function hasDecimal(num){
    return !!(num % 1);
}

console.log(hasDecimal(2)); //false
console.log(hasDecimal(2.32423)); //true

したがって、明らかに一部のユーザーは説明を求めています。私はそれをバラバラにします:(num%1)

括弧は、これらの操作を最初に実行することを意味します。num-関数によって渡される変数。%-左の数値を右の数値で除算しようとする係数シンボル。余りがある場合は、10進数として返します。均等に分割すると0を返します。

つまり、これまでのところを要約すると、(num%1)が返されます。

均等に分割された場合は0、そうでない場合は#。#####

0 == false。

[ANY_NUMBER_NOT_ZERO] == true。

例:new Boolean(0)はfalse new Boolean(12312.1231)はtrue

その他の選択肢:ユーザーが(num%1)の値を返そうとした可能性がありますが、これは基本的に同じことを実現します。return(0)はfalseであり、return(1.213113)はtrueであるため。

しかし、ブール値を返したかったのです。値をブール値に強制するショートカットとして、私は!その前のシンボル。

知っているかもしれない限り、。は意味しません。ただし、値をブール値に強制します。

以来!symobolは値をブール値に強制し、その値を逆にします。私が使う !!値をブール値に強制し、その値を元のブール値に反転します。

ここに画像の説明を入力してください


このコードは質問に答えることがありますが、問題を解決する方法および/または理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
Nic3500

0

チェック番号の関数は10進数または整数です

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

    if (p_decimalNumber % 1 == 0)
        l_boolIsExist = false;

    return l_boolIsExist;
}

0

多分これはあなたのために働きますか?

正規表現を使用して、数値にカンマがあるかどうかを確認します。カンマがない場合は、カンマとストライプを追加します。

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);

StackOverflowへようこそ。このコードが何をするのか、なぜそれが問題を解決すると思うのか、詳しく説明してください。
クインズ

@quinz正規表現を使用して、数値にカンマがあるかどうかを確認し、ない場合はカンマとストライプを追加します。そのため、丸められた価格タグのフォーマットを追加する追加機能で質問が求めていることを実行します。
user11608734

0

値が文字列の場合(たとえばから<input)、次を使用します。

Math.floor(value).toString() !== value

(小数点区切り文字または別の文字列で終わる).toString()場合にも機能するように、floor を追加しvalue == "1."ます。また、Math.floor常に何らかの値を返すため、.toString()失敗することはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.