Kiểm tra xem một số có vị trí thập phân / là một số nguyên


284

Tôi đang tìm kiếm một cách dễ dàng trong JavaScript để kiểm tra xem một số có vị trí thập phân trong đó hay không (để xác định xem đó có phải là số nguyên không). Ví dụ,

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

Câu trả lời:


819

Sử dụng mô-đun sẽ hoạt động:

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

Lưu ý rằng điều này dựa trên giá trị số của số, bất kể định dạng. Nó xử lý các chuỗi số chứa toàn bộ số có dấu thập phân cố định giống như số nguyên:

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

10
Tôi đã không bỏ phiếu nhưng tôi muốn nói là có gì đó với 20.0, vẫn có dấu thập phân và thỏa mãn điều trên. +1 từ tôi dù sao cũng đã dạy tôi điều gì đó mới :)
Abe Petrillo

7
@Abe: đủ đúng, mặc dù tôi nghĩ điều đó là không thể. Không thể nói nếu 20.0có một dấu thập phân theo chương trình, trừ khi nó được biểu thị dưới dạng một chuỗi. Ngoài ra, không có giải pháp nào khác bị bỏ phiếu vì không giải quyết được điều đó ;-)
Andy E

1
@SREEP: xem bình luận ở trên. 0,00 không phải là 0,00 trong JavaScript khi được biểu diễn dưới dạng giá trị số. Nó có thể được biểu diễn dưới dạng một chuỗi ("0,00"), trong trường hợp đó, câu hỏi cho câu hỏi đó là "kiểm tra xem một chuỗi có phải là một số nguyên" thay vì "kiểm tra xem một số có phải là một số nguyên không" .
Andy E

3
@Swanidhi: ý bạn là gì? Điều gì sẽ không hợp lệ? "10."là một số nguyên và kết quả sẽ giống hệt như "10"hoặc 10.
Andy E

3
OP hỏi về việc kiểm tra nếu SỐ là một số nguyên. Ông không đề cập đến chuỗi - về vấn đề đó, câu trả lời của Andy là đúng.
Om Shankar

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

Number.isInteger () là một phần của tiêu chuẩn ES6 và không được hỗ trợ trong IE11.

Nó trả về false cho NaN, Infinitylý lẽ và không phải số trong khi x % 1 != 0trả về true.


2
giải pháp thất bại trong 12.0
Vikas Arora

@VikasArora Không, nó hoạt động như dự định. Number.isInteger(12.0)trả lại true.
le_m

Điều này có vẻ như nó phải là câu trả lời đúng, nhưng không may, nó không làm việc cho ký hiệu khoa học, ví dụ như Number.isInteger('1e3')false, mặc dù Number.isInteger(1e3)là đúng. Giả sử mục đích của câu hỏi là tìm các giá trị không nguyên (thay vì sự hiện diện thực tế của dấu thập phân trong biểu diễn), thì giá trị chuỗi '12 .0 ' sẽ vượt qua vì nó đại diện cho một số nguyên, nhưng một lần nữa, Number.isInteger('12.0')false.
brianmearns

@brianmearns Câu hỏi của OP là liệu a numbercó toàn bộ hay không. Nếu đầu vào của bạn là một chuỗi, dĩ nhiên bạn cần chuyển đổi nó thành một chuỗi, numberví dụ như thông qua parseFloat().
le_m

47

Hoặc bạn chỉ có thể sử dụng điều này để tìm hiểu xem nó KHÔNG phải là số thập phân:

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

2
Tôi nghĩ rằng đây là giải pháp thực tế vì nó hoạt động ngay cả đối với XX.0
Deepankar Sarkar

5
chuyển đổi thành chuỗi trước khi tiếp tục .. tức là: yournumber.toString.indexOf(".")
Daniel Omine

1
francisco_ssb .. biểu tượng điểm là phổ quát ... đại diện cho vị trí thập phân trong ngôn ngữ toán học .. đây là phổ quát và nên hoạt động ở bất kỳ quốc gia nào. Nếu bạn nói về dấu phẩy (","), bạn phải chuyển đổi thành điểm (".") Trước chỉ mụcOf ("."), Rõ ràng ..
Daniel Omine

1
Tôi nghĩ khi anh ta nói nó không hoạt động ở một số quốc gia, anh ta đang đề cập đến tiền tệ, vì Euro sử dụng dấu phẩy thay vì dấu thập phân. Tuy nhiên, câu hỏi không cụ thể đối với tiền tệ, chỉ là số thập phân ... như trong một phần nhỏ của một số.
Tessa

1
Điều này không hoạt động nếu số thập phân là 1,00 và bạn muốn nó là số nguyên trừ khi bạn ép buộc giá trị
simon-pr

21

Giải pháp phổ biến nhất là tước phần nguyên của số và so sánh nó với số 0 như vậy:

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

31
Tại sao không chỉ startVal != Math.floor(startVal)?
Andy E

2
Đẹp. Cùng một khái niệm, nhưng phiên bản của bạn thậm chí còn sạch hơn.
Thomas

1
@Andy E: Điều này chỉ có thể đối với các số dương. Nó sẽ không hoạt động đối với các số âm ..
Seeya K

3
@SeeyaK: tất nhiên nó sẽ hoạt động cho các số âm. Xin vui lòng thử nó.
Andy E

1
@DeepakGidel - Đó là theo thiết kế. Các Math.Floorchức năng có giá trị thập phân và giá trị thập phân lớn nhất cho phép trong JavaScript là 2^53 - 1hay 9007199254740991. Vì 893144042145698745.3lớn hơn mức tối đa này, chức năng sẽ thất bại.
Thomas

20

Đơn giản mà hiệu quả!

Math.floor(number) === number;

4
@OmShankar hiệu quả! = Hiệu quả
Fiddles

Math.floor(3.0) == 3.0là đúng, Math.floor(3.3) == 3.3là sai
Rohmer

@Fiddles, ồ đúng rồi, đó là điều tôi muốn nói: Không hiệu quảhiệu suất này chậm hơn nhiều so với phương pháp% mod. Cảm ơn đã sửa lỗi
Om Shankar

19

// Làm thế nào về byte-ing nó?

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

Tôi luôn cảm thấy tệ cho các nhà khai thác bit trong javascript-

họ hầu như không tập thể dục


14
Điều đó không thành công đối với các số nguyên lớn hơn 2 ^ 31 - 1, vì >>chuyển đổi giá trị thành số nguyên 32 bit đã ký .
Matthew Crumley

1
@kennebec tuyệt vời - đó là giải pháp thú vị nhất. Và nó là một cái quái gì đó tốt hơn rất nhiều so với RegEx.
Daniel B. Chapman

5
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

Khá tuyệt và cũng hoạt động cho những thứ như XX.0! Nó hoạt động vì Math.floor () loại bỏ bất kỳ số thập phân nào nếu có một số thập phân vì vậy nếu sàn khác với số ban đầu, chúng tôi biết đó là số thập phân! Và không có chuyển đổi chuỗi :)


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

4
Thất bại cho num= 999999999999999999999.
bobince

1
chuyển đổi thành chuỗi đầu tiên và sau đó làm lại.
ghostdog74

Làm việc cho tôi mà không chuyển đổi thành chuỗi.
Abe Petrillo

4

Number.isInteger()có lẽ là ngắn gọn nhất Nó trả về true nếu nó là số nguyên và false nếu không.


1
Đây phải là câu trả lời được chấp nhận, bởi vì nó tốt hơn sau đó sử dụng mô đun do các vấn đề chuỗi.
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;
}

Không cần một lời giải thích. Nó khá đơn giản.
Grant Birchmeier

1
Nếu chuỗi chứa bất kỳ giá trị nào trong strCheck, thì đó là số thập phân ... (anh ta đang bỏ lỡ. Và, mặc dù ...
NicoJuicy 6/2/2015

2
parseInt(num) === num

khi truyền một số, parseInt()chỉ trả về số đó là int:

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

4
Tôi thích cái này rất nhiều, nhưng phụ thuộc vào nhu cầu cụ thể của một người. Thật không may, tôi cần một chức năng để FAIL kiểm traparseInt(3.0) === 3.0 // true
zipzit

2

chuyển chuỗi số thành mảng, chia theo dấu thập phân. Sau đó, nếu mảng chỉ có một giá trị, điều đó có nghĩa là không có số thập phân trong chuỗi.

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

Bằng cách này bạn cũng có thể biết số nguyên và số thập phân thực sự là gì. một ví dụ nâng cao hơn sẽ là.

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

if(!dece){
    //do stuff
}

1

Đây là một đoạn trích từ thư viện bảo vệ của tôi (lấy cảm hứng từ JavaScript hiệu quả của 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

1

Bạn có thể nhân nó với 10 và sau đó thực hiện thao tác / modison " modulo " với 10 và kiểm tra xem kết quả của hai thao tác đó có bằng không. Kết quả của hai thao tác đó sẽ cung cấp cho bạn chữ số đầu tiên sau dấu thập phân. Nếu kết quả bằng 0 thì số đó là một số nguyên.

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


1

Bạn có thể sử dụng các thao tác bitwise không thay đổi giá trị ( ^ 0hoặc ~~) để loại bỏ phần thập phân, có thể được sử dụng để làm tròn. Sau khi làm tròn số, nó được so sánh với giá trị ban đầu:

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

Bạn có thể sử dụng chức năng sau để kiểm tra xem một số có vị trí thập phân hay không:

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

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

Vì vậy, rõ ràng một số người dùng muốn giải thích. Tôi sẽ chia nó thành từng mảnh: (num% 1)

Dấu ngoặc có nghĩa là thực hiện các hoạt động đầu tiên. num - một biến được truyền vào bởi hàm. % - một ký hiệu mô đun cố gắng chia số bên trái cho bên phải. Nếu có phần còn lại, nó trả về dưới dạng thập phân. Nếu nó chia đều, nó trả về 0.

Vì vậy, tổng hợp những gì chúng ta có cho đến nay., (Num% 1) sẽ trả về:

0 khi chia đều HOẶC #. ##### nếu không

0 == sai.

[ANY_NUMBER_NOT_ZERO] == đúng.

Ví dụ: Boolean mới (0) là sai Boolean mới (12312.1231) là đúng

Các lựa chọn thay thế khác: Một người dùng có thể đã cố gắng trả về giá trị của (num% 1)., Về cơ bản sẽ đạt được điều tương tự. Vì return (0) là false và return (1.213113) là true.

Nhưng tôi muốn trả về một giá trị boolean. Vì vậy, như là một phím tắt để buộc một giá trị vào một boolean tôi đã thêm một! biểu tượng trước nó.

Nhiều như có thể biết.,! có nghĩa là KHÔNG. Nhưng nó cũng buộc một giá trị vào một boolean.

Kể từ khi! symobol buộc giá trị thành boolean và nó đảo ngược giá trị của nó. Tôi sử dụng !! để buộc giá trị thành một boolean và đảo ngược giá trị của nó trở lại giá trị boolean ban đầu của nó.

nhập mô tả hình ảnh ở đây


Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Nic3500

0

Hàm cho số kiểm tra là số thập phân hoặc toàn bộ

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}

0

Có lẽ điều này làm việc cho bạn?

Nó sử dụng regex để kiểm tra xem có dấu phẩy nào trong số không và nếu không có thì nó sẽ thêm dấu phẩy và sọc.

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

Chào mừng bạn đến với StackOverflow. Bạn có thể giải thích những gì mã này làm và tại sao bạn nghĩ rằng nó sẽ giải quyết vấn đề.
quinz

@quinz Nó sử dụng regex để kiểm tra xem có dấu phẩy nào trong số không và nếu không có thì nó sẽ thêm dấu phẩy và sọc. Vì vậy, nó làm những gì câu hỏi đang yêu cầu với chức năng được thêm vào để thêm định dạng cho các thẻ giá được làm tròn.
dùng11608734

0

Sử dụng sau nếu giá trị là chuỗi (ví dụ từ <input):

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

Tôi thêm .toString()vào sàn để làm cho nó hoạt động cũng cho các trường hợp khi value == "1."(kết thúc bằng dấu tách thập phân hoặc chuỗi khác). Cũng Math.floorluôn trả về một số giá trị để .toString()không bao giờ thất bại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.