Chuyển đổi số âm thành số dương trong JavaScript


308

Có hàm toán học nào trong JavaScript chuyển đổi số thành giá trị dương không?

Câu trả lời:


704

Bạn có thể sử dụng ...

Math.abs(x)

Math​.abs()| MDN


1
Bạn thậm chí có thể muốn xem xét ~ x + 1. Nó khá nhanh, nhưng không rõ nó đang làm gì. Đã đánh dấu điều này để cho thấy sự khác biệt: jsperf.com/absolute-int
omgaz

22
@omgaz Họ không giống nhau ... var x = -100; ~x+1 === 100nhưng var x = 100; ~x+1 === -100. Math.absluôn luôn làm cho nó trở nên tích cực trong khi lấy những cái bổ sung đơn giản là đảo ngược dấu hiệu.
jduncanator

Bạn thậm chí có thể muốn xem xét -x. Nó khá nhanh!
amara

93

Thế còn x *= -1? Tôi thích sự đơn giản của nó.


17
Trong khi điều này là đơn giản, nó làm cho giả định rằng con số sẽ luôn âm. Nếu trường hợp sử dụng là như vậy, thì nó tuyệt vời. Nếu không, tôi khuyên bạn nên thận trọng.
myusuf 11/07/2015

4
Tôi không đồng ý @myusuf. Bất kỳ số nào xsẽ được lật. Nếu x = 23và được đẩy vào phương trình đó, xthì sẽ bằng nhau -23. Theo lời của ông Escalante, "Một lần tích cực một tiêu cực bằng một tiêu cực. Một lần tiêu cực một tiêu cực bằng một tích cực." ... "Làm thế nào để tôi đạt được những kiiiiiiids này?!"
ExcellentSP

2
Chính xác là @Shane ngày hôm qua. Nếu x=23, sau đó nó sẽ trở thành -23. Như câu hỏi, 'Chuyển đổi số âm thành số dương trong JS', nhưng ở trên sẽ lật bất kỳ số nào, có thể là số dương hoặc số âm.
myusuf

2
Hiểu. Giải thích của tôi về nhận xét của bạn là trong bối cảnh lật số và không làm cho xluôn luôn tích cực. Tôi xin lỗi @myusuf.
ExcellentSP

1
chỉ cần nhắc rằng giải pháp này không áp dụng cho số Float, nó chỉ nhận được phần thập phân
Oscar Luza

46

Math.abs(x)hoặc nếu bạn chắc chắn giá trị là âm trước khi chuyển đổi, chỉ cần thêm một dấu trừ thông thường : x = -x.


29

Dấu trừ (-) có thể chuyển đổi số dương thành số âm và số âm thành số dương. x=-ylà đường trực quan cho x=(y*-1).

var y = -100;
var x =- y;


12
var posNum = (num < 0) ? num * -1 : num; // if num is negative multiple by negative one ... 

Tôi thấy giải pháp này dễ hiểu.


8

Nếu bạn muốn viết mã thú vị mà không ai khác có thể cập nhật, hãy thử điều này:

~ --x


1
Điều này sẽ không hoạt động với các điểm nổi mặc dù ... và giá trị của x cũng thay đổi.
Alexis Wilke

Tôi đoán nếu bạn không thể thay đổi x: ~ --x; ++ x
Kyle

1
Kyle, ~toán tử không chuyển đổi số thành số nguyên 32 bit. Nếu bạn có một float như đầu vào, nó sẽ bị hos.
Alexis Wilke

7

Tôi biết điều này hơi muộn, nhưng đối với những người đấu tranh với điều này, bạn có thể sử dụng các chức năng sau:

  • Biến bất kỳ số dương

    let x =  54;
    let y = -54;
    let resultx =  Math.abs(x); //  54
    let resulty =  Math.abs(y); //  54
  • Biến bất kỳ số âm

    let x =  54;
    let y = -54;
    let resultx = -Math.abs(x); // -54
    let resulty = -Math.abs(y); // -54
  • Đảo ngược bất kỳ số nào

    let x =  54;
    let y = -54;
    let resultx = -(x);         // -54
    let resulty = -(y);         //  54

6

Tiêu cực đến tích cực

var X = -10 ;
var number = Math.abs(X);     //result 10

Tích cực đến tiêu cực

var X = 10 ;
var number = (X)*(-1);       //result -10

Tôi thấy những gì bạn muốn thể hiện nhưng cách bạn đặt nó là khó hiểu. Có lẽ bạn nên nói: to positive: sử dụng abs, to neg: abs (x) * -1. Bằng cách này, bạn không ngụ ý dấu hiệu X trước đây là gì.
Dionys

5

Nhân với (-1) là cách nhanh nhất để chuyển đổi số âm thành dương. Nhưng bạn phải cẩn thận để không chuyển đổi sai lầm của tôi một số tích cực thành tiêu cực! Vì vậy, kiểm tra bổ sung là cần thiết ...

Thì Math.abs, Math.floor và parseInt là chậm nhất.

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

https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1


1
Một số người trong chúng ta quên làm thế nào toán học cơ bản hữu ích có thể trong các trường hợp như vậy. Cảm ơn đã nhắc nhở tôi về sự đơn giản như vậy.
Alexander Dixon

2

Tôi đã làm một cái gì đó như thế này bản thân mình.

num<0?num*=-1:'';

Nó kiểm tra xem số đó có phải là số âm hay không và nếu có, nhân với -1 Điều này sẽ trả về một giá trị, tùy thuộc vào bạn nếu bạn nắm bắt được nó. Trong trường hợp bạn muốn gán nó cho một cái gì đó, có lẽ bạn nên làm một cái gì đó như:

var out = num<0?num*=-1:num; //I think someone already mentioned this variant.

Nhưng nó thực sự phụ thuộc vào mục tiêu của bạn là gì. Đối với tôi nó thật đơn giản, làm cho nó tích cực nếu tiêu cực, khác không làm gì cả. Do đó '' trong mã. Trong trường hợp này, tôi đã sử dụng toán tử cấp ba vì tôi muốn, nó rất có thể là:

if(num<0)num*=-1;

Tôi đã thấy giải pháp bitwise ở đây và cũng muốn bình luận về giải pháp đó.

~--num; //Drawback for this is that num original value will be reduced by 1

Theo tôi, linh hồn này rất lạ mắt, chúng tôi có thể viết lại như thế này:

~(num = num-1);

Nói một cách đơn giản, chúng ta lấy số âm, lấy một số từ nó và sau đó đảo ngược nó. Nếu chúng ta đã đảo ngược bitwise một cách bình thường, chúng ta sẽ nhận được giá trị 1 quá nhỏ. Bạn cũng có thể làm điều này:

~num+1; //Wont change the actual num value, merely returns the new value

Điều đó sẽ làm tương tự nhưng sẽ đảo ngược trước và sau đó thêm 1 vào số dương. Mặc dù bạn CANT làm điều này:

~num++; //Wont display the right value.

Điều đó sẽ không hoạt động vì mức độ ưu tiên , các toán tử postfix như num++sẽ được đánh giá trước ~ và lý do tiền tố sẽ không ++numhoạt động mặc dù nó có cùng mức ưu tiên như bitwise KHÔNG (~), vì nó được đánh giá từ phải sang trái. Tôi đã cố gắng trao đổi chúng xung quanh nhưng có vẻ như tiền tố hơi khó so với bitwise KHÔNG. +1 sẽ hoạt động vì '+' có độ ưu tiên cao hơn và sẽ được đánh giá sau.

Tôi thấy giải pháp đó khá thú vị và quyết định mở rộng về nó vì nó vừa được ném vào đó và đăng mọi người nhìn vào nó có lẽ đang phớt lờ nó. Mặc dù có, nó sẽ không hoạt động với phao.

Hy vọng của tôi là bài đăng này đã không rời khỏi câu hỏi ban đầu. : /


2

Cách tiếp cận tối thiểu của tôi

Để chuyển đổi số âm thành dương & ngược lại

var num = -24;
num -= num*2;
console.log(num)
// result = 24


0

Bạn có thể sử dụng toán tử ~ chuyển đổi logic thành số âm và thêm 1 vào số âm:

var x = 3;
x = (~x + 1);
console.log(x)
// result = -3


0

Tôi biết một cách khác để làm điều đó. Kỹ thuật này hoạt động tiêu cực đến tích cực và Phó Versa

var x = -24;
var result = x * -1;

Ngược lại:

var x = 58;
var result = x * -1;

MÃ SỐ:

// NEGATIVE TO POSITIVE: ******************************************
var x = -24;
var result = x * -1;
console.log(result);

// VICE VERSA: ****************************************************
var x = 58;
var result = x * -1;
console.log(result);

// FLOATING POINTS: ***********************************************
var x = 42.8;
var result = x * -1;
console.log(result);

// FLOATING POINTS VICE VERSA: ************************************
var x = -76.8;
var result = x * -1;
console.log(result);


Điều đó không trả lời câu hỏi. dave yêu cầu một chức năng thay đổi giá trị âm thành tích cựctích cực thành tích cực .
RaphaMex

Câu hỏi của anh ấy nói "Có hàm toán học nào trong JavaScript chuyển đổi số thành giá trị dương không?" Ông không đề cập tích cực đến tích cực. Ông chỉ đề cập tiêu cực đến tích cực. Tại sao bạn muốn chuyển đổi tích cực sang tích cực. Giá trị sẽ là như nhau.
Tarryk Ttmm

Bạn có thể yêu cầu làm rõ trong một bình luận bên dưới câu hỏi. Dù sao, có một câu trả lời được chấp nhận đó là câu trả lời đúng. Bạn có thể đọc lại và thấy rằng có một hàm tích hợp ... chuyển đổi tích cực thành tích cực.
RaphaMex


0

Nếu bạn muốn con số luôn luôn tích cực, bất kể bạn có thể làm gì.

function toPositive(n){
    if(n < 0){
        n = n * -1;
    }
    return n;
}
var a = toPositive(2);  // 2
var b = toPositive(-2); // 2

Bạn cũng có thể thử nó, nhưng tôi không khuyến khích nó:

function makePositive(n){
    return Number((n*-n).toString().replace('-','')); 
}
var a = makePositive(2);  // 2
var b = makePositive(-2); // 2

Vấn đề với điều này là bạn có thể thay đổi số thành âm, sau đó chuyển đổi thành chuỗi và loại bỏ - khỏi chuỗi, sau đó chuyển đổi trở lại int. Mà tôi đoán sẽ mất nhiều xử lý hơn sau đó chỉ sử dụng chức năng khác.

Tôi đã thử nghiệm điều này trong php và hàm đầu tiên nhanh hơn, nhưng đôi khi JS thực hiện một số điều điên rồ, vì vậy tôi không thể chắc chắn.


Ví dụ thứ hai cho ra sức mạnh của số đầu vào. n*-nnên n*-1. Tuy nhiên, tôi sẽ xóa ví dụ hoàn toàn, vì các chuyển đổi loại và lệnh gọi phương thức rất kém hiệu quả so với tính đơn giản của ví dụ đầu tiên. Ngay cả sự khó hiểu của JS cũng không thể giúp được ở đây
Gust van de Wal
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.