Bir sayının ondalık basamağı olup olmadığını / bir tam sayı olup olmadığını kontrol edin


284

(Bir tamsayı olup olmadığını belirlemek için) bir sayı ondalık bir yer olup olmadığını kontrol etmek için JavaScript kolay bir yol arıyorum. Örneğin,

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

Yanıtlar:


820

Modülü kullanmak işe yarayacaktır:

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

Bunun biçimden bağımsız olarak sayının sayısal değerini temel aldığını unutmayın . Tamsayılarla aynı sabit ondalık noktası olan tam sayılar içeren sayısal dizeleri ele alır:

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

10
Oy vermedim ama 20.0 ile ilgili bir şey olduğunu söyleyebilirim, hala ondalık noktası var ve yukarıdakileri tatmin ediyor. Bana yeni bir şey öğretmek için benden +
Abe Petrillo

7
@Abe: yeterince doğru olsa da, bunun mümkün olmadığını düşünüyorum. 20.0Bir dize olarak ifade edilmediği sürece programlı olarak ondalık noktası olup olmadığını söylemek imkansızdır . Ayrıca, diğer çözümlerin hiçbiri ;-) ile mücadele etmemek için aşağı oy alamadı
Andy E

1
@SREEP: yukarıdaki yorumlara bakın. Sayı değeri olarak gösterildiğinde, JavaScript'te 0.00, 0.00 değildir. Bir dize ("0.00") olarak temsil edilebilir; bu durumda, "sayının bir tam sayı olup olmadığını kontrol etmek " yerine "bir dizenin tam sayı olup olmadığını kontrol etmek" sorusudur .
Andy E

3
@Swanidhi: ne demek istiyorsun? Ne geçerli olmayacak? "10."bir tamsayıdır ve sonuç "10"veya ile tam olarak aynı olur 10.
Andy E

3
OP NUMARANIN bir tam sayı olup olmadığını kontrol etmesini ister . Hiçbir yerde iplerden bahsetmiyor - bu açıdan Andy'nin cevabı doğru.
Om Shankar

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

Number.isInteger () , ES6 standardının bir parçasıdır ve IE11'de desteklenmez.

Bunun için false döndürür NaN, Infinityve sayısal olmayan argümanları ise x % 1 != 0döner gerçek.


2
çözüm 12.0 için başarısız
Vikas Arora

@VikasArora Hayır, istendiği gibi çalışıyor. Number.isInteger(12.0)döner true.
le_m

Bu doğru cevabı olmalı, ama ne yazık ki, örneğin, bilimsel gösterim için çalışmaz gibi görünüyor Number.isInteger('1e3')olduğunu falseolsa Number.isInteger(1e3)doğrudur. Söz konusu amaç varsayılarak, daha sonra dize değeri '12 .0' (yerine temsili bir ondalık noktasının fiili varlığı daha az) tamsayı olmayan değerleri bulmak için gereken bir tam sayıyı temsil eder, ancak yine olarak geçirmek, Number.isInteger('12.0')bir false.
brianmearns

@brianmearns OP'nin sorusu a'nın bir numberbütün olup olmadığıdır. Girişiniz bir dize ise, bunu bir numberilk örneğe dönüştürmeniz gerekir, örneğin parseFloat(), tabii ki.
le_m

47

Veya bunu ondalık DEĞİL olup olmadığını öğrenmek için kullanabilirsiniz:

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

2
Bence bu gerçek çözüm çünkü bu XX.0 için bile çalışıyor
Sarkar

5
devam etmeden önce dizeye dönüştür .. ie: yournumber.toString.indexOf(".")
Daniel Omine

1
francisco_ssb .. nokta sembolü evrenseldir ... matematik dilinde ondalık yeri temsil eder .. bu evrenseldir ve herhangi bir ülkede çalışmalıdır. Virgül (",") hakkında konuşuyorsanız, indexOf'dan (".") Önce noktaya (".") Dönüştürmeniz gerekir.
Daniel Omine

1
Sanırım bazı ülkelerde işe yaramadığı anlamına geldiğinde, Euro ondalık nokta yerine virgül kullandığından para biriminden bahsediyor. Ancak, soru para birimine özgü değildir, sadece ondalık sayılar ... bir sayının bir kısmında olduğu gibi.
Tessa

1
Ondalık 1.00 ise ve değeri zorlamadığınız sürece int olmasını istiyorsanız bu işe yaramaz
simon-pr

21

En yaygın çözüm, sayının tamsayı kısmını çıkarmak ve bunu sıfıra karşılaştırmaktır:

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

31
Neden sadece startVal != Math.floor(startVal)?
Andy E

2
Güzel. Aynı kavram, ancak sürümünüz daha da temiz.
Thomas

1
@Andy E: Bu sadece pozitif sayılar için mümkündür. Negatif sayılar için çalışmaz ..
Seeya K

3
@SeeyaK: Tabii ki negatif sayılar için çalışacak. Lütfen denemekten çekinmeyin.
Andy E

1
@DeepakGoyal - Bu tasarım gereğidir. Math.FloorFonksiyon ondalık bir değer alır ve JavaScript izin verilen en büyük ondalık değerdir 2^53 - 1ya 9007199254740991. Yana 893144042145698745.3bu maksimum değerden daha büyük, işlev başarısız olur.
Thomas

20

Basit ama etkili!

Math.floor(number) === number;

4
@OmShankar verimli! = Etkili
Fiddles

Math.floor(3.0) == 3.0doğru, Math.floor(3.3) == 3.3yanlış
Rohmer

@Fiddles, ah, söylemek istediğim şey bu : % mod yöntemine kıyasla performansta çok daha yavaş olduğu için verimli değil .
Om Shankar

19

// Bayt etmeye ne dersiniz?

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

Javascript'teki bit operatörleri için her zaman biraz kötü hissediyorum.

neredeyse hiç egzersiz yapmıyorlar.


14
>>Değeri işaretli bir 32 bit tam sayıya dönüştürdüğü için , 2 ^ 31 - 1'den büyük tamsayılar başarısız olur .
Matthew Crumley

1
@kennebec awesome - bu en eğlenceli çözüm. Ve bu bir RegEx'ten çok daha iyi bir halt.
Daniel B. Chapman

5
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

Oldukça güzel ve XX.0 gibi şeyler için de çalışıyor! Math.floor () varsa ondalık keser çünkü zemin orijinal sayıdan farklıysa ondalık olduğunu biliriz! Ve dize dönüşümü yok :)


4
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);

4
İçin başarısız num= 999999999999999999999.
bobince

1
önce dizeye dönüştürün ve sonra yeniden yapın.
ghostdog74

Dize dönüştürmeden benim için çalıştı.
Abe Petrillo

4

Number.isInteger()muhtemelen en özlüdür. Bir tamsayı ise doğru, değilse bir tamsayı döndürür.


1
Bu, kabul edilen cevap olmalıdır, çünkü dize sorunları nedeniyle modülü kullanmak daha iyidir.
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;
}

Bir açıklamaya gerek yok. Oldukça basit.
Grant Birchmeier

1
Dize strCheck değerlerin herhangi birini içerirse, o ... gerçi ... Bir ondalık var (o kaçırdığını ve.
NicoJuicy

2
parseInt(num) === num

bir sayı geçtiğinde parseInt(), sayıyı int olarak döndürür:

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

4
Bunu çok seviyorum, ama kişinin özel ihtiyaçlarına bağlı. Ne yazık ki, testi parseInt(3.0) === 3.0 // true
BAŞARMAK

2

sayı dizesini ondalık noktaya bölerek diziye dönüştürür. Sonra, dizi yalnızca bir değere sahipse, bu dize ondalık yok demektir.

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

Bu şekilde tamsayı ve ondalık sayıların gerçekte ne olduğunu da öğrenebilirsiniz. daha gelişmiş bir örnek olurdu.

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

if(!dece){
    //do stuff
}

1

İşte koruma kütüphanemden bir alıntı (David Herman'dan Etkili JavaScript'ten esinlenilmiştir):

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

Şunları yapabilirsiniz 10 ile çarpın ve daha sonra bir "do modülo " operasyonu / Divisónde 10 ile ve bu iki faaliyet sonucu sıfır mı bakın. Bu iki işlemin sonucu size ondalık noktadan sonraki ilk basamağı verecektir . Sonuç sıfıra eşitse, sayı bir tamsayıdır.

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


1

Yuvarlama için kullanılabilen ondalık kısmı atmak için değeri ( ^ 0veya ~~) değiştirmeyen bitsel işlemleri kullanabilirsiniz . Sayıyı yuvarladıktan sonra, orijinal değerle karşılaştırılır:

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

Bir sayının ondalık basamakları olup olmadığını kontrol etmek için aşağıdaki işlevi kullanabilirsiniz:

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

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

Görünüşe göre bazı kullanıcılar açıklama istiyor. Parçalara ayıracağım: (num% 1)

Parantez, önce bu işlemleri yapmak anlamına gelir. num - fonksiyon tarafından iletilen bir değişken. % - sol sayıyı sağa bölmeye çalışan bir modül sembolü. Kalan varsa, ondalık olarak döndürür. Eşit olarak bölünürse 0 döndürür.

Yani, şimdiye kadar sahip olduklarımızı özetleyin., (Num% 1) geri dönecek:

Eşit olarak bölündüğünde 0 VEYA # .#### değilse

0 == yanlış.

[ANY_NUMBER_NOT_ZERO] == doğru.

Örnekler: yeni Boolean (0) yanlış yeni Boolean (12312.1231) doğru

Diğer alternatifler: Bir kullanıcı temelde aynı şeyi elde edecek olan (num% 1) değerini döndürmeye çalışabilirdi. Dönüş (0) yanlış ve dönüş (1.213113) doğru olduğundan.

Ama bir boole değeri döndürmek istedim. Yani bir değeri bir boole zorlamak için bir kısayol olarak bir! önce sembol.

Bildiği kadarıyla.,! DEĞİL anlamına gelir. Ama aynı zamanda bir değeri bir boole değerine zorlar.

Beri ! symobol değeri bir boole değerine zorlar ve değerini tersine çevirir. Kullanırım !! değeri bir boole değerine zorlamak ve değerini orijinal boolean değerine geri çevirmek için.

resim açıklamasını buraya girin


Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne dair ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Nic3500

0

Kontrol numarası işlevi Ondalık veya tam sayıdır

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}

0

Belki bu senin için işe yarıyor mu?

Sayıda virgül olup olmadığını kontrol etmek için regex kullanır ve yoksa virgül ve şerit ekler.

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

StackOverflow'a hoş geldiniz. Bu kodun ne yaptığını ve neden sorunu çözeceğini düşündüğünüzü açıklayabilir misiniz?
quinz

@quinz Sayıda virgül olup olmadığını kontrol etmek için regex kullanır ve yoksa virgül ve şerit ekler. Bu nedenle, yuvarlak fiyat etiketleri için biçimlendirme ekleme işlevinin eklenmesi ile sorunun ne istediğini yapar.
user11608734

0

Değer dize ise (örneğin <input):

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

(Ondalık ayırıcı veya başka bir dize ile biter) .toString()durumlarda da işe yaraması için yere ekleyin value == "1.". Ayrıca Math.floorher zaman bir değer döndürür, bu yüzden .toString()asla başarısız olmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.