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.
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.
Câu trả lời:
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;
Bạn đang tìm kiếm giá trị tuyệt đối, bạn đời. Math.abs(-5)
trả về 5 ...
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
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!
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));
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.
-
(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]
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ị:
value = (-value);
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));
}
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;
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 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);
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ụ:
int x=-5;
System.out.println(Math.abs(x));
Đầu ra: 5
int y=6;
System.out.println(Math.abs(y));
Đầu ra: 6
Để 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
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 đề.
Bạn có thể vui lòng thử cái này không?
public static int toPositive(int number) {
return number & 0x7fffffff;
}
Trong kotlin bạn có thể sử dụng unaryPlus
input = input.unaryPlus()
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/unary-plus.html
đừ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