Periksa apakah suatu bilangan memiliki tempat desimal / bilangan bulat

284

Saya mencari cara mudah dalam JavaScript untuk memeriksa apakah angka memiliki tempat desimal di dalamnya (untuk menentukan apakah itu bilangan bulat). Misalnya,

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

Jawaban:

822

Menggunakan modulus akan bekerja:

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

Catatan bahwa ini didasarkan pada numerik nilai dari nomor tersebut, terlepas dari format. Ini memperlakukan string numerik yang berisi bilangan bulat dengan titik desimal tetap sama dengan bilangan bulat:

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5
Andy E
sumber
10
Saya tidak memilih, tetapi saya akan mengatakan itu ada hubungannya dengan 20.0, masih memiliki titik desimal dan memenuhi hal di atas. Tetap 1 dari saya untuk mengajari saya sesuatu yang baru :)
Abe Petrillo
7
@Be: cukup benar, meskipun saya pikir itu tidak mungkin. Tidak mungkin mengatakan jika 20.0memiliki titik desimal secara pemrograman, kecuali jika dinyatakan sebagai string. Selain itu, tidak ada solusi lain yang memilih untuk tidak menangani hal itu ;-)
Andy E
1
@SREEP: lihat komentar di atas. 0,00 bukan 0,00 dalam JavaScript bila direpresentasikan sebagai nilai angka. Ini dapat direpresentasikan sebagai string ("0,00"), dalam hal ini pertanyaan untuk itu adalah "memeriksa apakah sebuah string adalah bilangan bulat " daripada "memeriksa apakah angka adalah bilangan bulat" .
Andy E
3
@Swanidhi: apa maksudmu? Apa yang tidak valid? "10."adalah bilangan bulat dan hasilnya akan persis sama dengan "10"atau 10.
Andy E
3
OP bertanya tentang memeriksa apakah NUMBER adalah bilangan bulat. Dia tidak menyebutkan string - dalam hal itu, jawaban Andy benar.
Om Shankar
58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger () adalah bagian dari standar ES6 dan tidak didukung di IE11.

Itu mengembalikan false untuk NaN, Infinitydan argumen non-numerik sementara x % 1 != 0mengembalikan true.

le_m
sumber
2
solusi gagal untuk 12.0
Vikas Arora
@VikasArora Tidak, ini berfungsi sebagaimana mestinya. Number.isInteger(12.0)kembali true.
le_m
Hal ini tampaknya seperti itu harus menjadi jawaban yang tepat, tapi sayangnya, itu tidak bekerja untuk notasi ilmiah, misalnya Number.isInteger('1e3')adalah false, meskipun Number.isInteger(1e3)benar. Dengan asumsi maksud pertanyaan adalah untuk menemukan nilai-nilai non-integer (daripada keberadaan sebenarnya dari titik desimal dalam representasi), maka nilai string '12 .0 ' harus lulus karena mewakili bilangan bulat, tetapi sekali lagi, Number.isInteger('12.0')adalah false.
brianmearns
@brianmearns pertanyaan OP adalah apakah numberkeseluruhan atau tidak. Jika input Anda berupa string, Anda harus mengubahnya menjadi yang numberpertama misalnya via parseFloat(), tentu saja.
le_m
47

Atau Anda bisa menggunakan ini untuk mengetahui apakah BUKAN desimal:

string.indexOf(".") == -1;
Ike
sumber
2
Saya pikir yang ini adalah solusi aktual karena ini bekerja bahkan untuk XX.0
Deepankar Sarkar
5
konversi ke string sebelum melanjutkan .. yaitu: yournumber.toString.indexOf(".")
Daniel Omine
1
francisco_ssb .. simbol titik bersifat universal ... mewakili tempat desimal dalam bahasa matematika .. ini universal dan harus bekerja di negara mana pun. Jika Anda berbicara tentang koma (","), Anda harus mengonversi ke titik (".") Sebelum indexOf ("."), Jelas ..
Daniel Omine
1
Saya pikir ketika dia bermaksud itu tidak bekerja di beberapa negara, dia mengacu pada mata uang, karena Euro menggunakan koma bukan titik desimal. Namun, pertanyaannya tidak spesifik untuk mata uang, hanya desimal ... seperti dalam pecahan angka.
Tessa
1
Ini tidak berfungsi jika desimal adalah 1,00 dan Anda ingin menjadi int kecuali Anda memaksa nilai
simon-pr
21

Solusi yang paling umum adalah dengan memotong bagian bilangan bulat dari angka dan membandingkannya dengan nol seperti ini:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}
Thomas
sumber
31
Kenapa tidak adil startVal != Math.floor(startVal)?
Andy E
2
Bagus. Konsep yang sama, tetapi versi Anda bahkan lebih bersih.
Thomas
1
@Andy E: Ini hanya mungkin untuk angka positif. Itu tidak akan berfungsi untuk angka negatif ..
Seeya K
3
@SeeyaK: tentu saja akan berfungsi untuk angka negatif. Silahkan mencobanya.
Andy E
1
@DeepakGoyal - Yaitu dengan desain. The Math.Floorfungsi mengambil nilai desimal dan nilai desimal terbesar diperbolehkan dalam JavaScript adalah 2^53 - 1atau 9007199254740991. Karena 893144042145698745.3lebih besar dari maksimum ini, fungsinya akan gagal.
Thomas
20

Sederhana tetapi efektif!

Math.floor(number) === number;
dYale
sumber
4
@OmShankar efisien! = Efektif
Fiddles
Math.floor(3.0) == 3.0benar, Math.floor(3.3) == 3.3salah
Rohmer
@Fiddles, oh benar, itu yang ingin saya katakan: Tidak efisien karena ini jauh lebih lambat dalam kinerja dibandingkan dengan metode% mod. Terima kasih telah mengoreksi
Om Shankar
19

// Bagaimana dengan byte-ing itu?

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

Saya selalu merasa agak buruk untuk operator bit di javascript-

mereka jarang berolahraga.

kennebec
sumber
14
Itu gagal untuk bilangan bulat yang lebih besar dari 2 ^ 31 - 1, karena >>mengubah nilai menjadi bilangan bulat 32-bit yang ditandatangani .
Matthew Crumley
1
@kennebec luar biasa - itu adalah solusi yang paling lucu. Dan itu jauh lebih baik daripada RegEx.
Daniel B. Chapman
5
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

Cukup keren dan berfungsi untuk hal-hal seperti XX.0 juga! Ini bekerja karena Math.floor () memenggal desimal apa pun jika memiliki desimal sehingga jika lantai berbeda dari angka semula, kita tahu itu desimal! Dan tidak ada konversi string :)


sumber
4
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);
ghostdog74
sumber
4
Gagal untuk num= 999999999999999999999.
bobince
1
konversikan ke string terlebih dahulu lalu lakukan re.
ghostdog74
Bekerja untuk saya tanpa mengubah ke string.
Abe Petrillo
4

Number.isInteger()mungkin yang paling ringkas. Ini mengembalikan true jika itu adalah bilangan bulat, dan false jika tidak.

Christopher Connery
sumber
1
Ini harus menjadi jawaban yang diterima, karena lebih baik daripada menggunakan modulus karena masalah string.
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;
}
Vitor Lins
sumber
Tidak perlu penjelasan. Sederhana saja.
Grant Birchmeier
1
Jika string berisi salah satu nilai di strCheck, itu adalah desimal ... (dia kehilangan. Dan, meskipun ...
NicoJuicy
2
parseInt(num) === num

ketika melewati nomor, parseInt()cukup kembalikan nomor itu sebagai int:

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true
Michael
sumber
4
Saya suka yang ini banyak, tetapi tergantung pada kebutuhan spesifik seseorang. Sayangnya, saya perlu fungsi untuk GAGAL tesparseInt(3.0) === 3.0 // true
zipzit
2

mengkonversi string angka menjadi array, dibagi dengan titik desimal. Kemudian, jika array hanya memiliki satu nilai, itu berarti tidak ada desimal dalam string.

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

Dengan cara ini Anda juga bisa tahu apa bilangan bulat dan desimal sebenarnya. contoh yang lebih maju adalah.

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

if(!dece){
    //do stuff
}
Kareem
sumber
1

Berikut kutipan dari perpustakaan penjaga saya (terinspirasi oleh JavaScript Efektif oleh David Herman):

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
schirrmacher
sumber
1

Anda dapat mengalikannya dengan 10 dan kemudian melakukan " modulo " operasi / divisi dengan 10 , dan periksa apakah hasil dari dua operasi itu nol. Hasil dari dua operasi itu akan memberi Anda digit pertama setelah titik desimal. Jika hasilnya sama dengan nol maka jumlahnya adalah bilangan bulat.

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}
BSevo
sumber
1
function isDecimal(num) {
  return (num !== parseInt(num, 10));
}
Steve Brush
sumber
1

Anda dapat menggunakan operasi bitwise yang tidak mengubah nilai ( ^ 0atau ~~) untuk membuang bagian desimal, yang dapat digunakan untuk pembulatan. Setelah membulatkan angka, itu dibandingkan dengan nilai aslinya:

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

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true
makovkastar
sumber
1
function isWholeNumber(num) {
  return num === Math.round(num);
}
Dmitry Shashurov
sumber
1

Anda dapat menggunakan fungsi berikut untuk memeriksa apakah suatu angka memiliki tempat desimal:

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

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

Jadi ternyata beberapa pengguna menginginkan penjelasan. Saya akan memecahnya menjadi potongan-potongan: (num% 1)

Parenthesis berarti melakukan operasi tersebut terlebih dahulu. num - variabel yang diteruskan oleh fungsi. % - simbol modulus yang mencoba membagi angka kiri dengan kanan. Jika ada sisa itu mengembalikannya sebagai desimal. Jika dibagi secara merata, mengembalikan 0.

Jadi, jumlahkan apa yang kita miliki sejauh ini., (Num% 1) akan kembali:

0 bila dibagi secara merata ATAU #. ##### jika tidak

0 == salah.

[ANY_NUMBER_NOT_ZERO] == true.

Contoh: Boolean baru (0) salah Boolean baru palsu (12312.1231) benar

Alternatif lain: Seorang pengguna dapat mencoba mengembalikan nilai (num% 1)., Yang pada dasarnya akan mencapai hal yang sama. Karena return (0) salah dan return (1.213113) benar.

Tetapi saya ingin mengembalikan nilai boolean. Jadi sebagai jalan pintas untuk memaksa nilai menjadi boolean saya menambahkan! simbol sebelum itu.

Sebanyak mungkin yang tahu.,! berarti TIDAK. Tapi itu juga memaksa nilai menjadi boolean.

Sejak! symobol memaksa nilai menjadi boolean dan nilai itu terbalik. Saya menggunakan !! untuk memaksa nilai menjadi boolean dan membalikkan nilainya kembali ke nilai boolean aslinya.

masukkan deskripsi gambar di sini

Twalow
sumber
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Nic3500
0

Fungsi untuk memeriksa nomor adalah Desimal atau bilangan bulat

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}
pengguna3897934
sumber
0

Mungkin ini bekerja untukmu?

Menggunakan regex untuk memeriksa apakah ada koma di nomor tersebut, dan jika tidak ada, maka itu akan menambahkan koma dan garis.

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);
pengguna11608734
sumber
Selamat datang di StackOverflow. Bisakah Anda menguraikan apa yang kode ini lakukan dan mengapa Anda pikir itu akan menyelesaikan masalah.
quinz
@quinz Menggunakan regex untuk memeriksa apakah ada koma di nomor tersebut, dan jika tidak ada maka akan menambahkan koma dan garis. Jadi itu tidak apa pertanyaannya dengan fungsi tambahan menambahkan pemformatan untuk label harga bulat.
user11608734
0

Gunakan berikut ini jika nilainya string (misalnya dari <input):

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

Saya menambahkan .toString()ke lantai untuk membuatnya berfungsi juga untuk kasus-kasus ketika value == "1."(diakhiri dengan pemisah desimal atau string lain). Juga Math.floorselalu mengembalikan beberapa nilai sehingga .toString()tidak pernah gagal.

michal.jakubeczy
sumber