2012-05-31 29 views
5

Tôi cố gắng để sửa chữa các mã Java sau,sai lầm Java với số

Tôi không thể hiểu tại sao bản in vẫn là 5.

public class simpleMath 
{ 
    public static void main(String[] args) 
    { 
     int number=5; 
     half(number); 

     System.out.println("5 divided by 2 is: " + number); 

    } 

    private static double half(int number) { 
     number = number/2; 
     return number; 
    } 
} 
+0

Bạn gọi phương thức phân chia của bạn, nhưng bạn không gán kết quả từ nó. Hãy thử System.out.println ("5 chia cho 2 là:" + một nửa (số)); nhưng tất nhiên - tốt hơn là sử dụng biến để giữ kết quả từ hoạt động. – hovanessyan

Trả lời

-5

Trước tiên, bạn cần phải biết loại bạn đang gán cho biến của mình.Bạn nên thay đổi mã của mình để trông giống như sau:

public class simpleMath 
    { 


     public static void main(String[] args) 
     { 
      double number = 5; 
      double answer = half(number); 

      System.out.println(" 5 divided by 2 is:"+ answer); 

     } 

     private static double half(double number) { 
      number = number/2.0; 
      return number; 
     } 

    } 

Xem cách bây giờ tôi sử dụng giá trị trả về và cách chia cho 2.0? những thay đổi này sẽ cung cấp cho bạn kết quả bạn đang tìm kiếm.

+0

tại sao tất cả các downvotes? Tôi đã đưa ra một câu trả lời tốt mà tôi biết công trình – jth41

+2

Tất cả các downvotes vì ​​bạn không * giải quyết * vấn đề của OP, bạn chỉ cần giấu nó đi. Anh ta không chỉ định giá trị trả về của 'half (number)', và giải pháp của bạn là gọi lại nó khi anh ta in? Điều này sẽ không giúp * OP theo bất kỳ cách nào. –

+0

wow hoàn toàn bỏ lỡ điều đó. Tôi chỉ chạy nó và cho rằng nó đúng. Cảm ơn vì đã cho tôi biết – jth41

9

Khi bạn gọi hàm, bạn đang vứt bỏ nó giá trị trả về:

half(number); 

Bạn có thể có nghĩa là để viết:

number = half(number); 

Ngoài ra, trong Java, các đối số được truyền theo giá trị. Điều này có nghĩa rằng, ngay cả khi bạn thay đổi number bên trong hàm, thay đổi sẽ không truyền lại cho người gọi.

Có một số vấn đề nữa:

Vấn đề 1: Sự thay đổi đề nghị sẽ lưu trữ kết quả trong number, mà là một biến số nguyên. Do đó, kết quả của half() - là loại double - sẽ bị cắt ngắn thành một số nguyên. Để tránh mất độ chính xác, bạn phải thay đổi number thành biến số dấu chấm động hoặc lưu trữ kết quả theo một biến khác của loại thích hợp.

Vấn đề 2: Sau đây sử dụng nguyên bộ phận:

number = number/2; 

Kết quả sẽ bỏ bớt một số nguyên, ví dụ: 5/22. Sau đó, sau đó được chuyển đổi thành một số double (2.0), đó là những gì hàm trả về.

Để khắc phục, thay đổi chức năng như vậy:

private static double half(int number) { 
    return number/2.0; 
} 

T.B. Số dấu chấm động có rất nhiều thuộc tính có thể không trực quan. Tôi khuyên bạn nên xem What Every Computer Scientist Should Know About Floating-Point Arithmetic.

+2

đúng, nhưng không thực sự trả lời câu hỏi mặc dù là nó ..;) – Nim

+0

không có số tôi lấy lại là 5 – Yui2

17

Vì bạn không gán lại giá trị trả về.

int number = 5; 
number = half(number); 
0

Đó là bởi vì bạn không gán giá trị trả về của half()-number - nó được tính toán nhưng không được sử dụng.

Bạn cần phải nói:

number = half(number); 

Cách bạn có nó hiện sẽ chỉ làm việc nếu number đã được thông qua tham khảo, không phải bởi giá trị.

1

Bạn chuyển loại dữ liệu nguyên thủy được thực hiện theo giá trị. Bạn cần cung cấp SOP theo phương thức half() EDIT: Cần sử dụng kết quả được trả về bởi phương thức half() bằng cách gán nó cho số hoặc gọi phương thức này trong chính SOP.

+0

Nhưng anh ta trả lại giá trị mới ... –

+1

Anh ta trả lại nhưng anh ta không gán lại nó cho 'số 'biến –

1

Tại sao half(number) không sửa đổi numberđược khai báo trong chức năng main()? Đó là vì bạn sẽ chuyển giá trị của number tới half() chức năng để đánh giá, tức là bạn cung cấp một bản sao có giá trị trong các hàm number đến half(). Do đó, bất kỳ chức năng nào của half() sẽ làm cho number sẽ không được phản ánh trở lại number biến số được khai báo trong main(). Bạn cần chỉ định giá trị trả lại là half() đến number trong main() nếu bạn muốn cập nhật giá trị của nó.

Có những trường hợp khác, chẳng hạn như đổ bóng biến, mà tôi sẽ không nói chi tiết, vì nó có thể gây nhầm lẫn cho bạn.

0
int number =5; 
half(number); 

Java không hỗ trợ truyền bằng tham chiếu. Vì vậy, trong trường hợp này, chúng tôi đang chuyển giá trị 5 không phải là tham chiếu của số.

Vì vậy, nếu chúng ta muốn nắm bắt những thay đổi sau đó gọi phương thức nên như thế này -

public class simpleMath 
{ 
    public static void main(String[] args) 
    { 
     int number =5; 
     number = half(number); 

     System.out.println(" 5 divided by 2 is:"+ number); 

    } 

    private static double half(int number) { 
     number = number/2; 
     return number; 
    } 
} 
Các vấn đề liên quan