Làm cách nào để chuyển đổi số nguyên thành float trong Java?


81

Tôi có hai số nguyên xy. Tôi cần tính toán x/yvà kết quả là tôi muốn được thả nổi. Ví dụ như kết quả của 3/2tôi muốn có 1,5. Tôi nghĩ rằng cách dễ nhất (hoặc duy nhất) để làm điều đó là chuyển đổi xythành kiểu float. Thật không may, tôi không thể tìm thấy một cách dễ dàng để làm điều đó. Bạn có thể vui lòng giúp tôi với?


7
kết quả float = ((float) x) / y?
mibollma

hãy khám phá cái này: xahlee.org/java-a-day/casting.html
fasseg

2
có thể trùng lặp của Java: chia 2 int tạo thành một int?
dogbane

1
@VinAy: Tôi không khuyến khích điều đó trong trường hợp này. BigDecimalkhông phải là một sự thay thế chính xác phổ biến cho float.
Matt Ball

1
@VinAy: Nó hoàn toàn phụ thuộc vào mục đích là gì. Nếu anh ta đang làm tài chính, bạn đã chính xác. Nếu anh ta đang tính toán quỹ đạo của tiểu hành tinh, thì bạn không phải vậy.
Marquis of Lorne,

Câu trả lời:


151

Bạn chỉ cần truyền ít nhất một trong các toán hạng vào float:

float z = (float) x / y;

hoặc là

float z = x / (float) y;

hoặc (không cần thiết)

float z = (float) x / (float) y;

Điều này có hiệu quả hơn không, so với: float z = (1.0 * x) / y; ? Chuyển đổi float bên trong có hiệu quả hơn phép nhân không? Tnx!
MSquare

1
Tôi không biết, nhưng tôi nghĩ nó không liên quan đến 99% trở lên. Nó thậm chí sẽ không phải là một nút cổ chai từ xa. Nếu bạn thực sự lo lắng, hãy tự đánh giá nó.
Matt Ball

1
Cái đầu tiên và cái thứ hai sẽ gây ra lỗi trên một số thiết bị nhánh nhất định, hãy đảm bảo bạn truyền cả hai số nguyên.
Oliver Dixon

java.lang.Integer không thể được đúc để java.lang.Float
asp

2
@ user3002853 đọc về loại đóng hộp so với loại nguyên thủy. docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Matt Ball

5

Bạn không nên sử dụng float trừ khi bạn phải làm như vậy. Trong 99% trường hợp, gấp đôi là lựa chọn tốt hơn.

int x = 1111111111;
int y = 10000;
float f = (float) x / y;
double d = (double) x / y;
System.out.println("f= "+f);
System.out.println("d= "+d);

bản in

f= 111111.12
d= 111111.1111

Theo bình luận của @ Matt.

float có độ chính xác rất nhỏ (6-7 chữ số) và hiển thị lỗi làm tròn đáng kể khá dễ dàng. double có độ chính xác 9 chữ số khác. Chi phí sử dụng double thay vì float là không đáng kể trong 99% trường hợp, tuy nhiên chi phí của một lỗi nhỏ do lỗi làm tròn cao hơn nhiều. Vì lý do này, nhiều nhà phát triển khuyên bạn không nên sử dụng dấu phẩy động và đặc biệt khuyên dùng BigDecimal.

Tuy nhiên, tôi thấy rằng double có thể được sử dụng trong hầu hết các trường hợp với điều kiện sử dụng cách làm tròn hợp lý .

Trong trường hợp này, int x có độ chính xác 32 bit trong khi float có độ chính xác 24 bit, ngay cả khi chia cho 1 cũng có thể có lỗi làm tròn. mặt khác, double có độ chính xác 53 bit là quá đủ để có được kết quả chính xác hợp lý.


6
Bạn nên giải thích tại sao double là tốt hơn float.
Matt Ball


4

// Số nguyên tôi muốn chuyển đổi

int myInt = 100;

// Truyền số nguyên sang float

float newFloat = (float) myInt

1
ít nhất là trong Android Studio, trình biên dịch sẽ phàn nàn về các loại không tương thích đang cố gắng thực hiện điều này.
Adam R. Turner

3

Đây là cách bạn có thể làm điều đó :

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int x = 3;
    int y = 2;
    Float fX = new Float(x);
    float res = fX.floatValue()/y;
    System.out.println("res = "+res);
}

Hẹn gặp lại!


7
Việc sử dụng kiểu wrapper ( Float) là hoàn toàn không cần thiết cho việc này.
Matt Ball

1
Vui lòng không sử dụng chữ ký hoặc dòng giới thiệu trong bài viết của bạn.
Mudgar

1

Tương tự:

float l = new Float(x/y)

sẽ không hoạt động, vì nó sẽ tính toán phép chia số nguyên của x và y trước, sau đó tạo một float từ nó.

float result = (float) x / (float) y;

Về mặt ngữ nghĩa là ứng cử viên tốt nhất.


Câu trả lời của bạn lẽ ra phải là một bình luận. Sameer sẽ không nhận được thông báo về bài đăng của bạn. Về mặt ngữ nghĩa, việc chuyển đổi cả hai int thành float trước khi tính toán kết quả là không cần thiết - do đó, nó không tốt hơn là chuyển đổi chỉ một. Nó tạo ra một ấn tượng sai, và do đó kém hơn, imho.
người dùng không xác định
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.