Câu trả lời:
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.
Thế còn x *= -1? Tôi thích sự đơn giản của nó.
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?!"
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.
xluôn luôn tích cực. Tôi xin lỗi @myusuf.
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;
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
~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.
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); // 54Biế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); // 54Tiê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
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.
https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1
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. : /
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
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
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 với một lập trình chức năng, Ramda có một phương pháp hay cho việc này. Phương pháp tương tự hoạt động đi từ tích cực sang tiêu cực và ngược lại.
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.
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