a

Câu hỏi Làm thế nào để kiểm tra giá trị đưa ra là một số nguyên dương hay âm?


Giả sử tôi có giá trị 10 được gán cho một biến;

var values = 10;

và tôi muốn chạy một hàm cụ thể nếu giá trị là dương

if(values = +integer){ 
    //do something with positive 
} else { 
    //do something with negative values 
}

Làm thế nào điều này sẽ đạt được?


56
2017-08-12 08:46


gốc


Tôi giả định rằng bạn đang tăng / giảm biến. Nếu vậy tại sao bạn không viết một điều kiện nếu để kiểm tra giá trị sau khi tăng / giảm biến? - Sagar V
Upvoted câu hỏi này - Tôi đã có một fart não lớn ngày hôm nay, cố gắng tìm ra cách để xác định xem một số là tích cực hay tiêu cực trong Javascript ngày hôm nay. Tôi đoán đó là khoảng thời gian nghỉ ngơi từ việc lập trình ..... - jedd.ahyoung
câu hỏi này đáng lẽ đã thực sự tuyệt vời trong năm 2011. - divine


Các câu trả lời:


if (values > 0) {
    // Do Something
}

135
2017-08-12 08:49



Chỉ muốn thêm một nhận xét: Tôi nhận thấy rằng câu hỏi ban đầu được hỏi không chỉ khi giá trị là tích cực, nhưng nếu nó là một tích cực số nguyên. Để giải quyết yêu cầu thứ hai, tôi đã tạo câu trả lời mới - stevendesu
mã của tôi không kiểm tra giá trị dương hay âm nếu các giá trị là một số nguyên. Vì nó nằm trong mã mẫu của anh ta. - Peter Kelly
Hãy nhận biết các con số như -2.2737367544323206e-13 (nghĩa là gần như bằng không). Tôi nghĩ rằng thảo luận này insteresting: stackoverflow.com/questions/588004/… - colares
câu trả lời này không kiểm tra nếu giá trị là dương số nguyên trong đó số nguyên là một số nguyên chứ không phải phân số - Reinsbrain
chỉ là một lưu ý ở đây: đã thử rằng hôm nay để xem nếu tôi có một số dương (int hoặc float) và nó cũng được đánh giá true cho values=true. Vì vậy ... kiểm tra xem values thực sự là một boolean! - wullxz


Để chỉ kiểm tra, đây là cách nhanh nhất, có vẻ như:

var sign = number > 0 ? 1 : number == 0 ? 0 : -1; 
//Is "number": greater than zero? Yes? Return 1 to "sign".
//Otherwise, does "number" equal zero?  Yes?  Return 0 to "sign".  
//Otherwise, return -1 to "sign".

Nó nói với bạn nếu ký hiệu là dương (trả về 1), hoặc là bằng không (trả về 0)nếu không (trả về -1). Đây là một giải pháp tốt bởi vì 0 không phải là tích cực, và nó không phải là tiêu cực, nhưng nó có thể là var của bạn.

Không thành công:

var sign = number > 0 ? 1 : -1;

...sẽ tính 0 là số nguyên âm, sai chỗ nào.

Nếu bạn đang cố gắng thiết lập điều kiện, bạn có thể điều chỉnh cho phù hợp. Dưới đây là hai ví dụ tương tự của câu lệnh if / else-if:

Ví dụ 1:

number = prompt("Pick a number?");
if (number > 0){
  alert("Oh baby, your number is so big!");}
else if (number == 0){
  alert("Hey, there's nothing there!");}
else{
  alert("Wow, that thing's so small it might be negative!");}

Ví dụ 2:

number = prompt("Pick a number?");

var sign = number > 0 ? 1 : number == 0 ? 0 : -1;

if (sign == 1){
  alert("Oh baby, your number is so big!" + " " + number);}
else if (sign == 0){
  alert("Hey, there's nothing there!" + " " + number);}
else if (sign == -1){
  alert("Wow, that thing's so small it might be negative!" + " " + number);}

19
2017-10-17 10:47



lol @ cảnh báo của bạn - Xavier
Cảm ơn, Xavier. Bạn có túi giáo viên của tôi, homie. XD - Wolfpack'08


Tôi có phải là người duy nhất đọc điều này và nhận ra rằng không có câu trả lời nào giải quyết phần "số nguyên" của câu hỏi?

Vấn đề

var myInteger = 6;
var myFloat = 6.2;
if( myInteger > 0 )
    // Cool, we correctly identified this as a positive integer
if( myFloat > 0 )
    // Oh, no! That's not an integer!

Giải pháp

Để đảm bảo rằng bạn đang xử lý một số nguyên, bạn muốn truyền giá trị của mình thành một số nguyên, sau đó so sánh nó với chính nó.

if( parseInt( myInteger ) == myInteger && myInteger > 0 )
    // myInteger is an integer AND it's positive
if( parseInt( myFloat ) == myFloat && myFloat > 0 )
    // myFloat is NOT an integer, so parseInt(myFloat) != myFloat

Một số tối ưu hóa gọn gàng

Như một phần thưởng, có một số phím tắt để chuyển đổi từ một phao sang một số nguyên trong JavaScript. Trong JavaScript, tất cả các toán tử bitwise (|, ^, &, vv) sẽ truyền số của bạn đến một số nguyên trước khi hoạt động. Tôi cho rằng điều này là do 99% nhà phát triển không biết tiêu chuẩn điểm nổi IEEE và sẽ bị nhầm lẫn khủng khiếp khi "200 | 2" được đánh giá là 400 (ish). Các phím tắt này có xu hướng chạy nhanh hơn hơn Math.floor hoặc là parseIntvà chúng chiếm ít byte hơn nếu bạn đang cố gắng loại bỏ mã nhỏ nhất có thể:

if( myInteger | 0 == myInteger && myInteger > 0 )
    // Woot!
if( myFloat | 0 == myFloat && myFloat > 0 )
    // Woot, again!

Nhưng xin chờ chút nữa!

Các toán tử bitwise này đang làm việc trên các số nguyên đã ký 32 bit. Điều này có nghĩa bit cao nhất là bit dấu. Bằng cách buộc bit dấu bằng không, số của bạn sẽ không thay đổi chỉ khi nó dương. Bạn có thể sử dụng điều này để kiểm tra tính tích cực và tích hợp trong một cú đánh duy nhất:

// Where 2147483647 = 01111111111111111111111111111111 in binary
if( (myInteger & 2147483647) == myInteger )
    // myInteger is BOTH positive and an integer
if( (myFloat & 2147483647) == myFloat )
    // Won't happen
* note bit AND operation is wrapped with parenthesis to make it work in chrome (console)

Nếu bạn gặp khó khăn khi nhớ số phức tạp này, bạn cũng có thể tính toán số đó trước khi thực hiện như sau:

var specialNumber = ~(1 << 31);

Đang kiểm tra âm

Per @ Reinsbrain bình luận, một hack bit tương tự có thể được sử dụng để kiểm tra tiêu cực số nguyên. Trong một số âm, chúng tôi làm muốn bit ngoài cùng bên trái là 1, do đó, bằng cách buộc bit này thành 1 số sẽ chỉ không thay đổi nếu nó là số âm để bắt đầu với:

// Where -2147483648 = 10000000000000000000000000000000 in binary
if( (myInteger | -2147483648) == myInteger )
    // myInteger is BOTH negative and an integer
if( (myFloat | -2147483648) == myFloat )
    // Won't happen

Con số đặc biệt này thậm chí còn dễ dàng hơn để tính toán:

var specialNumber = 1 << 31;

Cạnh trường hợp

Như đã đề cập trước đó, vì các toán tử bitwise của JavaScript chuyển đổi thành các số nguyên 32 bit, các số không phù hợp với 32 bit (lớn hơn ~ 2 tỷ) sẽ thất bại

Bạn có thể quay trở lại giải pháp dài hơn cho các giải pháp sau:

if( parseInt(123456789000) == 123456789000 && 123456789000 > 0 )

Tuy nhiên ngay cả giải pháp này không thành công tại một số điểm, bởi vì parseInt bị giới hạn về độ chính xác của nó đối với số lượng lớn. Hãy thử những điều sau và xem điều gì sẽ xảy ra:

parseInt(123123123123123123123); // That's 7 "123"s

Trên máy tính của tôi, trong bảng điều khiển Chrome, kết quả đầu ra này: 123123123123123130000

Lý do cho điều này là parseInt xử lý đầu vào như một phao IEEE 64 bit. Điều này chỉ cung cấp 52 bit cho mantissa, có nghĩa là giá trị cực đại của ~ 4.5e15 trước khi nó bắt đầu làm tròn


14
2017-07-10 16:23



Tôi nên lưu ý rằng điều này sẽ không làm việc cho số nguyên lớn hơn 2147483647. Ví dụ: 99999999999 & 2147483647 = 1215752191 - stevendesu
Trên thực tế, câu hỏi không yêu cầu kiểm tra nếu nó là một loại số nguyên và nếu số nguyên đó là dương. Nó hỏi nếu 'var values ​​= 10' là một số nguyên dương như được hiển thị trong mã được cung cấp, đó là tất cả những gì chúng ta có thể làm việc. - Peter Kelly
@ PeterKelly, tôi e rằng tôi thực sự không hiểu câu hỏi này mơ hồ như thế nào. Anh ấy nói: "Cách kiểm tra giá trị được đưa ra là dương hoặc âm số nguyên?Nếu câu trả lời của tôi không phải là một giải pháp hợp lệ cho vấn đề của anh ta và một bài học hay về JavaScript nên có lẽ không xứng đáng được bỏ phiếu xuống. - stevendesu
@stevendesu là đúng. Số nguyên là một phần của câu hỏi. - Mohamed Anis Dahmani
@stevendesu này phải là câu trả lời được chấp nhận, đặc biệt là nếu bạn có thể sửa đổi câu trả lời cũng xử lý các trường hợp số nguyên âm. làm việc tốt và cảm ơn ví dụ tuyệt vời - Reinsbrain


Tôi nghĩ ở đây bạn muốn thực hiện hành động nếu nó là tích cực.

Sau đó, sẽ đề nghị:

if (Math.sign(number_to_test) === 1) {
     function_to_run_when_positive();
}

8
2018-02-13 15:58



Các awnser chỉ chính xác khi nói đến số dương / âm. - dbf
Câu trả lời hay nhất! Có giá trị cho bất kỳ loại số nào. - felansu


1 Kiểm tra giá trị dương

Trong javascript so sánh đơn giản như: giá trị> == 0 không cung cấp cho chúng tôi câu trả lời do sự tồn tại của -0 và +0 (Đây là khái niệm có nguồn gốc trong phương trình phái sinh) Dưới đây là ví dụ về các giá trị và tính chất của nó:

var negativeZero = -0;
var negativeZero = -1 / Number.POSITIVE_INFINITY;
var negativeZero = -Number.MIN_VALUE / Number.POSITIVE_INFINITY;

var positiveZero = 0;
var positiveZero = 1 / Number.POSITIVE_INFINITY;
var positiveZero = Number.MIN_VALUE / Number.POSITIVE_INFINITY;

-0 === +0                     // true
1 / -0                        // -Infinity
+0 / -0                       // NaN
-0 * Number.POSITIVE_INFINITY // NaN

Có điều đó trong tâm trí chúng ta có thể viết chức năng như dưới đây để kiểm tra các dấu hiệu của số lượng nhất định:

function isPositive (number) {
    if ( number > 0 ) { 
        return true;
    }
    if (number < 0) {
        return false;
    }
    if ( 1 / number === Number.POSITIVE_INFINITY ) {
        return true;
    }
    return false;
}

2a Kiểm tra số là một số nguyên (theo nghĩa toán học)

Để kiểm tra số đó là một số nguyên, chúng ta có thể sử dụng hàm dưới đây:

function isInteger (number) {
    return parseInt(number) === number;
}
//* in ECMA Script 6 use Number.isInteger

2b Kiểm tra số là một số nguyên (trong khoa học máy tính)

Trong trường hợp này, chúng tôi đang kiểm tra con số đó không có bất kỳ phần mũ nào (xin lưu ý rằng trong các số JS được thể hiện bằng định dạng dấu phẩy động kép chính xác) Tuy nhiên trong javascript nó có thể sử dụng nhiều hơn để kiểm tra giá trị đó là "số nguyên an toàn" (http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) - để đặt nó đơn giản nó có nghĩa là chúng ta có thể thêm / trừ 1 đến "số nguyên an toàn" và chắc chắn rằng kết quả sẽ giống như mong đợi từ các bài học toán học. Để minh họa ý tôi, kết quả của một số hoạt động không an toàn dưới đây:

Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2;          // true
Number.MAX_SAFE_INTEGER * 2 + 1 === Number.MAX_SAFE_INTEGER * 2 + 4;  // true

Ok, do đó, để kiểm tra số đó là số nguyên an toàn, chúng tôi có thể sử dụng Number.MAX_SAFE_INTEGER / Number.MIN_SAFE_INTEGER và parseInt để đảm bảo số đó là số nguyên.

function isSafeInteger (number) {
    return parseInt(number) === number
    && number <== Number.MAX_SAFE_INTEGER
    && number >== Number.MIN_SAFE_INTEGER
}
//* in ECMA Script 6 use Number.isSafeInteger

6
2018-05-24 12:28



1 Tôi nghĩ rằng điều này là tốt hơn so với câu trả lời của tôi vì nó bao gồm các trường hợp cạnh của số không âm và MAX_SAFE_INTEGER. Câu trả lời của tôi đưa ra một giải pháp ngắn gọn và hiệu quả cao, nhưng chỉ chú ý đến các trường hợp cạnh. - stevendesu


if ( values > 0 ) {
    // Yeah, it's positive
}

5
2017-08-12 08:49



cảm ơn Gustav! +1 - Xavier


chỉ cần viết:

if(values > 0){
//positive
}
else{
//negative
}

5
2017-08-12 08:49





if(values >= 0) {
 // as zero is more likely positive than negative
} else {

}

5
2017-08-12 08:51