Cách chuyển đổi float sang int với Java


342

Tôi đã sử dụng dòng sau để chuyển đổi float sang int, nhưng nó không chính xác như tôi muốn:

 float a=8.61f;
 int b;

 b=(int)a;

Kết quả là: 8(Nó nên 9)

Khi nào a = -7.65f, kết quả là: -7(Nên là -8)

Cách tốt nhất để làm điều đó là gì?


16
Tôi nên chỉ ra rằng chỉ đánh máy cắt xén giá trị và không thực hiện bất kỳ thao tác làm tròn / sàn nào trên giá trị.
Brian Graham

Câu trả lời:


678

Sử dụng Math.round()sẽ làm tròn số float đến số nguyên gần nhất.


1
Tại sao typecast cần thiết sau Math.round ()?
Necromancer

81
Math.round()trả về intgiá trị để typecasting sử dụng (int)là dư thừa.
Solvek

5
sử dụng hoặc / hoặc ... (int)foolà đơn giản hơn.
yuttadhammo

31
Câu trả lời của Solvek là đúng, nhưng tôi muốn chỉ ra rằng Math.round () có thể có hai loại đầu ra khác nhau dựa trên đầu vào. Math.round (double a) trả về một khoảng dài. Math.round (float a) trả về một int. docs.oracle.com/javase/7/docs/api/java/lang/iêng
Hososugi

2
Math.round () là một hoạt động chậm so với chuyển sang (int)
darkgaze

186

Trên thực tế, có nhiều cách khác nhau để downcast float thành int, tùy thuộc vào kết quả bạn muốn đạt được: (đối với int i, float f)

  • vòng (số nguyên gần nhất để thả nổi)

    i = Math.round(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -3

    lưu ý: đây là, theo hợp đồng, bằng (int) Math.floor(f + 0.5f)

  • cắt ngắn (tức là bỏ mọi thứ sau dấu thập phân)

    i = (int) f;
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
  • trần / sàn (một số nguyên luôn lớn hơn / nhỏ hơn một giá trị đã cho nếu nó có bất kỳ phần phân số nào)

    i = (int) Math.ceil(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  3 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
    
    i = (int) Math.floor(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -3 ; f = -2.68 -> i = -3

Để làm tròn các giá trị dương , bạn cũng có thể chỉ sử dụng (int)(f + 0.5), hoạt động chính xác như Math.Roundtrong các trường hợp đó (theo tài liệu).

Bạn cũng có thể dùng Math.rint(f) để làm tròn đến số nguyên chẵn gần nhất ; nó có thể hữu ích nếu bạn dự kiến ​​xử lý nhiều phao có phần phân số hoàn toàn bằng 0,5 (lưu ý các vấn đề làm tròn của IEEE có thể) và muốn giữ mức trung bình của tập hợp; Tuy nhiên, bạn sẽ giới thiệu một thiên vị khác, trong đó các số chẵn sẽ phổ biến hơn lẻ.

Xem

http://mindprod.com/jgloss/round.html

http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html

để biết thêm thông tin và một số ví dụ.


rint là làm tròn ngân hàng; nó giúp giảm các lỗi có thể xuất hiện nếu bạn liên tục làm tròn 0,5 lên hoặc xuống.
prosfilaes

@prosfilaes Tôi đã thay đổi từ ngữ và thêm một liên kết wiki vào phần đó của câu trả lời.

15

Math.round(value) làm tròn giá trị đến số nguyên gần nhất.

Sử dụng

1) b=(int)(Math.round(a));

2) a=Math.round(a);  
   b=(int)a;

6

Math.round cũng trả về một giá trị số nguyên, vì vậy bạn không cần phải đánh máy.

int b = Math.round(float a);

13
Những câu trả lời khác đã nói điều này. Vui lòng chỉ thêm một câu trả lời mới khi bạn có một cái gì đó mới để thêm. (Ngoài ra, Math.round không trở lại int.)
Jeffrey Bosboom

1
Ông đưa ra lời giải thích về việc không cần typecast (để trả lời Sachithra). Nhưng nó có thể được chuyển đổi như bình luận.
Ranjith Kumar

5

Sử dụng Math.round(value)sau đó sau khi gõ nó thành số nguyên.

float a = 8.61f;
int b = (int)Math.round(a);

Math.round (float) trả về một int, tôi không chắc tại sao việc truyền vào int là cần thiết
Nephilim

-1

Theo tôi, dễ dàng hơn: (int) (a +.5) // a là Float. Trả về giá trị làm tròn.

Không phụ thuộc vào các loại Java Math.round ()


4
Điều này sẽ gây nhầm lẫn cho rất nhiều nhà phát triển phân tích mã. Nó sẽ không rõ ràng nó đang làm tròn.
ivan.panasiuk

1
Tất nhiên, đó chỉ là toán học cơ bản, hãy thử
Bruno L.

4
"Toán học cơ bản" là một thuật ngữ tương đối. :) Theo kinh nghiệm của tôi, tôi có thể đặt cược rằng hơn 50% các nhà phát triển sẽ không hiểu rằng nó thực sự làm tròn. Nó đúng về mặt toán học, nhưng như tôi đã viết, nó không rõ ràng và thật khó để người khác hiểu được mã này làm gì.
ivan.panasiuk

2
-(int) ( PI / 3 ): thử mã của bạn với số âm a... kể từ khi làm -0.5tròn đến 0?

bạn đúng nếu số âm, bạn phải thêm -0,5 thay vào đó
Bruno L.
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.