Tạo số âm dương


146

Tôi có một phương thức Java trong đó tôi tổng hợp một bộ số. Tuy nhiên, tôi muốn bất kỳ số âm nào được coi là dương. Vậy (1) + (2) + (1) + (- 1) nên bằng 5.

Tôi chắc chắn có một cách rất dễ dàng để làm điều này - tôi chỉ không biết làm thế nào.



5
Làm tôi ngạc nhiên khi những câu hỏi cơ bản như vậy lại nhận được rất nhiều sự ủng hộ ...
Jose Rui Santos

Các câu hỏi của tôi hợp lý hơn câu hỏi này nhưng nó có quá nhiều lượt tải xuống
không có ai vào

Câu trả lời:


365

Chỉ cần gọi Math.abs . Ví dụ:

int x = Math.abs(-5);

Mà sẽ thiết lập xđể 5.


42
Lưu ý các trường hợp cạnh, ví dụ Math.abs (Integer.MIN_VALUE) = Integer.MIN_VALUE.
Zach Scrivena

((a <= 0,0D)? 0,0D - a: a)
Koekiebox

103

Khái niệm bạn đang mô tả được gọi là "giá trị tuyệt đối" và Java có một hàm gọi là Math.abs để làm điều đó cho bạn. Hoặc bạn có thể tránh chức năng gọi và tự thực hiện:

number = (number < 0 ? -number : number);

hoặc là

if (number < 0)
    number = -number;

21
Ôi, thời gian tiến thoái lưỡng nan - có rất nhiều câu trả lời tốt như nhau, mà tôi cũng có thể xóa câu trả lời của mình. Nhưng sau đó tôi sẽ mất 40 điểm và tôi sẽ không bao giờ bắt Jon Skeet nếu tôi làm điều đó.
Paul Tomblin

3
Xin lỗi -1 vì đã phát minh lại một cuộc gọi thư viện tiêu chuẩn.
cletus

12
@cletus, bạn có để ý rằng tôi đã đề cập đến cuộc gọi thư viện tiêu chuẩn không? Hoặc trong trường hợp này, "phát minh lại" có ít hướng dẫn gọi thư viện hơn?
Paul Tomblin

Cũng đáng để hiểu các chi tiết đằng sau cuộc gọi thư viện. Đặc biệt là nếu có tác dụng phụ đối với cuộc gọi thư viện, hoặc các vấn đề về hiệu suất như Paul đề cập.
simon

Cũng +1 vì @cletus -1. Bạn tạo ra các lập trình viên tốt hơn bằng cách hiển thị cả giải pháp tiêu chuẩn tốt nhất cho một vấn đề VÀ giải pháp đó thực sự đang làm gì (hoặc một cái gì đó có thể so sánh với nó).
Francisco Zarabozo


12

Sử dụng abschức năng:

int sum=0;
for(Integer i : container)
  sum+=Math.abs(i);

8

Mã này không an toàn để được gọi vào số dương.

int x = -20
int y = x + (2*(-1*x));
// Therefore y = -20 + (40) = 20

3
Chúng ta có thể nhân với -1 thay vì làm điều này. Tôi có thiếu thứ gì không?
Siva Kranthi Kumar

7

Hãy thử điều này (âm ở phía trước x là hợp lệ vì nó là toán tử đơn nguyên, tìm thêm ở đây ):

int answer = -x;

Với điều này, bạn có thể biến tích cực thành tiêu cực và tiêu cực thành tích cực.


Tuy nhiên , nếu bạn chỉ muốn làm cho số âm trở nên tích cực thì hãy thử điều này:

int answer = Math.abs(x);

HOẶC , nếu bạn không muốn sử dụng phương thức abs () vì một số lý do thì hãy thử điều này:

int answer = Math.sqrt(Math.pow(x, 2));

Hy vọng nó giúp! Chúc may mắn!


6

Bạn đang hỏi về giá trị tuyệt đối?

Math.abs (...) là chức năng bạn có thể muốn.


6

Bạn muốn bọc từng số vào Math.abs(). ví dụ

System.out.println(Math.abs(-1));

in ra "1".

Nếu bạn muốn tránh viết Math.phần -part, bạn có thể bao gồm Toán sử dụng tĩnh. Chỉ viết

import static java.lang.Math.abs;

cùng với nhập khẩu của bạn và bạn có thể tham khảo các abs()chức năng chỉ bằng cách viết

System.out.println(abs(-1));

5

Cách đơn giản nhất, nếu cách dài dòng để làm điều này là bọc từng số trong lệnh gọi Math.abs (), vì vậy bạn sẽ thêm:

Math.abs(1) + Math.abs(2) + Math.abs(1) + Math.abs(-1)

với những thay đổi logic để phản ánh cách cấu trúc mã của bạn. Verbose, có lẽ, nhưng nó làm những gì bạn muốn.


3
Bạn có thể làm cho nó ít dài dòng hơn bằng cách nhập tĩnh.
Dan Dyer

1
Nếu anh ta có quyền kiểm soát trực tiếp các giá trị, sẽ tốt hơn nếu chỉ xóa -(các) dấu hiệu? Hoặc nếu không, bao gồm nếu anh ta không có quyền kiểm soát, sẽ tốt hơn nếu sử dụng một hàm như absoluteSum( int[] values ){ /*loop with Math.abs()*/ }thay vì gói thủ công Math.abs () trong mỗi giá trị? [-1]
XenoRo

Tôi đồng ý. Đóng gói logic trong một chức năng được đặt tên tốt sẽ làm cho điều này rõ ràng hơn.
Eddie

5

Khi bạn cần biểu diễn một giá trị mà không có khái niệm về sự mất hoặc vắng mặt (giá trị âm), đó được gọi là "giá trị tuyệt đối".


Logic để có được giá trị tuyệt đối rất đơn giản : "If it's positive, maintain it. If it's negative, negate it".


Điều này có nghĩa là logic và mã của bạn sẽ hoạt động như sau:

//If value is negative...
if ( value < 0 ) {
  //...negate it (make it a negative negative-value, thus a positive value).
  value = negate(value);
}

Có 2 cách bạn có thể phủ nhận một giá trị:

  1. Bởi, tốt, phủ nhận giá trị của nó: value = (-value);
  2. Bằng cách nhân nó với "100% âm" hoặc "-1": value = value * (-1);

Cả hai thực sự là hai mặt của cùng một đồng tiền. Chỉ là bạn thường không nhớ điều đó value = (-value);thực sự value = 1 * (-value);.


Chà, như cách bạn thực sự làm điều đó trong Java, nó rất đơn giản, vì Java đã cung cấp một hàm cho điều đó, trong Math class:value = Math.abs(value);

Vâng, làm nó mà không Math.abs()chỉ là một dòng mã với toán học rất đơn giản, nhưng tại sao làm cho mã của bạn trông xấu xí? Chỉ cần sử dụng Math.abs()chức năng được cung cấp của Java ! Họ cung cấp nó cho một lý do!

Nếu bạn thực sự cần phải bỏ qua chức năng, bạn có thể sử dụng value = (value < 0) ? (-value) : value;, đây đơn giản là một phiên bản nhỏ gọn hơn của mã tôi đã đề cập trong phần logic (thứ 3), sử dụng toán tử Ternary ( ? :) .


Ngoài ra, có thể có những tình huống mà bạn muốn luôn thể hiện sự mất hoặc vắng mặt trong một hàm có thể nhận cả giá trị dương và âm.

Thay vì thực hiện một số kiểm tra phức tạp, bạn chỉ có thể nhận được giá trị tuyệt đối và phủ nhận nó: negativeValue = (-Math.abs(value));


Với ý nghĩ đó và xem xét một trường hợp có tổng nhiều số như của bạn, sẽ là một ý tưởng hay khi thực hiện một hàm:

int getSumOfAllAbsolutes(int[] values){
  int total = 0;
  for(int i=0; i<values.lenght; i++){
    total += Math.abs(values[i]);
  }
  return total;
}

Tùy thuộc vào xác suất bạn có thể cần mã lại liên quan, bạn cũng nên thêm chúng vào thư viện "utils" của riêng mình, trước tiên tách các hàm đó thành các thành phần cốt lõi của chúng và duy trì chức năng cuối cùng đơn giản như một tổ hợp các lệnh gọi các chức năng hiện tại của các thành phần cốt lõi:

int[] makeAllAbsolute(int[] values){
  //@TIP: You can also make a reference-based version of this function, so that allocating 'absolutes[]' is not needed, thus optimizing.
  int[] absolutes = values.clone();
  for(int i=0; i<values.lenght; i++){
    absolutes[i] = Math.abs(values[i]);
  }
  return absolutes;
}

int getSumOfAllValues(int[] values){
  int total = 0;
  for(int i=0; i<values.lenght; i++){
    total += values[i];
  }
return total;
}

int getSumOfAllAbsolutes(int[] values){
  return getSumOfAllValues(makeAllAbsolute(values));
}

3

Tại sao bạn không multiply that number with -1?

Như thế này:

//Given x as the number, if x is less than 0, return 0 - x, otherwise return x:
return (x <= 0.0F) ? 0.0F - x : x;

2

Nếu bạn quan tâm đến các cơ chế của phần bù hai, thì đây là cách hoàn toàn không hiệu quả, nhưng mang tính minh họa, điều này được thực hiện:

private static int makeAbsolute(int number){
     if(number >=0){
        return number;
     } else{
        return (~number)+1;
     }
}

Tại sao nó hoàn toàn không hiệu quả? Tôi không thấy bất kỳ vòng lặp nào làm cho nó không hiệu quả. Tôi đã bỏ lỡ một cái gì đó?
aldok

2

Tôi muốn giới thiệu các giải pháp sau:

không có niềm vui lib:

    value = (value*value)/value

(Ở trên không thực sự hoạt động.)

với niềm vui lib:

   value = Math.abs(value);

14
không phải là người đầu tiên kết quả trong một số âm một lần nữa?
dùng2875404

1
String s = "-1139627840";
BigInteger bg1 = new BigInteger(s);
System.out.println(bg1.abs());

Cách khác:

int i = -123;
System.out.println(Math.abs(i));

1

Chức năng thư viện Math.abs()có thể được sử dụng.
Math.abs()trả về giá trị tuyệt đối của đối số

  • nếu đối số là phủ định, nó trả về phủ định của đối số.
  • nếu đối số là dương, nó sẽ trả về số đó.

ví dụ:

  1. int x=-5;
    System.out.println(Math.abs(x));

Đầu ra: 5

  1. int y=6;
    System.out.println(Math.abs(y));

Đầu ra: 6


1

Để chuyển đổi số âm thành số dương (đây được gọi là giá trị tuyệt đối), sử dụng Math.abs (). Phương thức Math.abs () này hoạt động như thế này

“number = (number < 0 ? -number : number);".

Trong ví dụ dưới đây, Math.abs(-1)sẽ chuyển đổi số âm 1 thành số 1 dương.

thí dụ

public static void main (String [] args) {

    int total = 1 + 1 + 1 + 1 + (-1);
    
    //output 3
    System.out.println("Total : " + total);
    
    int total2 = 1 + 1 + 1 + 1 + Math.abs(-1);
    
    //output 5
    System.out.println("Total 2 (absolute value) : " + total2);
    
}

Đầu ra

Tổng cộng: 3 Tổng 2 (giá trị tuyệt đối): 5


0

Tôi cần giá trị tuyệt đối của một khoảng thời gian dài và nhìn sâu vào Math.abs và thấy rằng nếu đối số của tôi nhỏ hơn LONG.MIN_VAL là -9223372036854775808l, thì hàm abs sẽ không trả về giá trị tuyệt đối mà chỉ trả về giá trị tối thiểu. Trong trường hợp nếu mã của bạn đang sử dụng giá trị abs này hơn nữa thì có thể có vấn đề.


4
Điểm chung của Long.MIN_VAL là bạn không thể có một khoảng thời gian dài "ít hơn LONG.MIN_VAL".
Paul Tomblin

0

Bạn có thể vui lòng thử cái này không?

public static int toPositive(int number) {
    return number & 0x7fffffff;
}

4
Trong một câu hỏi mười năm tuổi với 17 câu trả lời khác, bạn nên giải thích khía cạnh mới của câu hỏi mà câu trả lời của bạn giải quyết. Bắt đầu một câu trả lời bằng một câu hỏi là một cách tốt để đóng nó nếu nó kết thúc trong hàng đợi đánh giá.
Jason Aller


-3

đừng làm điều này

số = (số <0? -Số: số);

hoặc là

if (số <0) số = -số;

Đây sẽ là một lỗi khi bạn chạy tìm lỗi trên mã của mình, nó sẽ báo cáo là RV_NEGATING_RESULT_OF

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.