Làm thế nào để truyền một nhân đôi thành một int trong Java bằng cách làm tròn nó xuống?


77

Tôi cần truyền một nhân đôi thành một int trong Java, nhưng giá trị số phải luôn làm tròn xuống. tức là 99,99999999 -> 99



Tôi tin rằng float và double là các kiểu dữ liệu khác nhau trong Java.
badpanda

Tôi nghĩ rằng chúng quá gần nhau vì cả hai đều là kiểu nguyên thủy và kiểu dấu phẩy động. Các câu trả lời đều giống nhau và rất có thể tiếp tục như vậy.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
Trên thực tế, câu hỏi dấu phẩy động chính xác hơn là hỏi cách làm tròn một phao (theo một số tiêu chuẩn làm tròn không xác định). Câu hỏi này, có thể được đổi tên thích hợp hơn thành 'Làm thế nào để làm tròn một đôi về 0 và ép kiểu int trong Java?' tương tự như hỏi làm thế nào để xếp tầng đôi, ngoại trừ việc làm tròn đến âm vô cùng thay vì hướng tới 0. Các câu trả lời khá khác nhau mặc dù tiêu đề của các câu hỏi là tương tự nhau.
badpanda

Câu trả lời:


141

Truyền tới một int hoàn toàn giảm bất kỳ số thập phân nào. Không cần gọi Math.floor () (giả sử là số dương)

Đơn giản chỉ cần gõ với (int), ví dụ:

System.out.println((int)(99.9999)); // Prints 99

Điều này đang được nói, nó thực sự có một hành vi khác Math.floormà từ đó vòng về phía âm vô cực (@Chris Wong)


27
Lưu ý rằng điều Math.floor đó tạo ra một kết quả khác cho số âm so với một kiểu đánh máy đơn giản.
Joey

3
Nó phụ thuộc vào ý nghĩa của OP khi "làm tròn". Phép ép làm tròn nó "xuống" về phía 0, trong khi Math.floor làm tròn về phía âm vô cùng.
Lambda Fairy

5
Cũng lưu ý rằng một int không thể đại diện cho tất cả các giá trị nguyên có thể có mà một double có thể. Nếu bạn muốn cắt bớt một giá trị có độ chính xác kép, thì hãy truyền thành một giá trị số nguyên 64 bit như long. System.out.println((long)(9.9999e300));
Monroe Thomas

1
Mặc dù các quy tắc làm tròn IEEE 754 sử dụng thuật ngữ cắt ngắn cho làm tròn về 0 và sử dụng các thuật ngữ đồng nghĩa làm tròn xuốnggiảm sàn cho làm tròn theo hướng âm-vô cực, Java BigDecimalRoundingModecác lớp sử dụng ROUND_DOWNcho làm tròn về 0 và ROUND_FLOORlàm tròn về phía- âm-vô cùng.
Andreas

32

Để ép kiểu nhân đôi thành số int và làm tròn thành số nguyên gần nhất (tức là không giống như số nguyên điển hình (int)(1.8)(int)(1.2), cả hai sẽ "làm tròn" về phía 0 và trả về 1), chỉ cần thêm 0,5 vào giá trị doublemà bạn sẽ nhập thành anint .

Ví dụ, nếu chúng ta có

double a = 1.2;
double b = 1.8;

Sau đó, các biểu thức đánh máy sau cho x và y và sẽ trả về các giá trị làm tròn xuống ( x = 1y = 1):

int x = (int)(a);   // This equals (int)(1.2) --> 1
int y = (int)(b);   // This equals (int)(1.8) --> 1

Nhưng bằng cách thêm 0,5 vào mỗi số, chúng ta sẽ nhận được kết quả làm tròn đến số nguyên gần nhất mà chúng ta có thể mong muốn trong một số trường hợp ( x = 1y = 2):

int x = (int)(a + 0.5);   // This equals (int)(1.8) --> 1
int y = (int)(b + 0.5);   // This equals (int)(2.3) --> 2

Là một lưu ý nhỏ , phương pháp này cũng cho phép bạn kiểm soát ngưỡng mà tại đó doubleđược làm tròn lên hoặc xuống khi (int)typecasting.

(int)(a + 0.8);

để đánh máy. Điều này sẽ chỉ làm tròn lên (int)a + 1bất cứ khi nào giá trị thập phân lớn hơn hoặc bằng 0,2. Tức là, bằng cách thêm 0,8 vào doublengay trước khi đánh máy, 10,15 và 10,03 sẽ được làm tròn thành 10 sau khi (int)đánh máy, nhưng 10,23 và 10,7 sẽ được làm tròn thành 11.


6
Bạn hoàn toàn đúng, nó không. Tôi thấy rằng chuỗi này bật lên khi Google nhập vào "Java int typecast double" và nhận thấy rằng ai đó đang tìm cách làm tròn lên / xuống trực tiếp với typecast (int) có thể sử dụng nó. Nội dung này không được đăng bằng tài khoản stackoverflow (vì vậy tôi không cố gắng nâng cao danh tiếng của mình, nếu điều đó được thực hiện nghiêm túc ở đây), chỉ cố gắng giúp truyền bá một thủ thuật thú vị mà tôi sử dụng khá thường xuyên. :) Chúc mừng!
JavaDrip

4
Tốt nhưng hãy nhớ rằng điều này chỉ hoạt động với những đôi tích cực . Ví dụ, nếu bạn vòng -0.8 với thủ thuật này, sau đó mã System.out.println(""+ (int)(-0.8d + 0.5))in 0, thay vì -1 như mong đợi
Gil Vegliach

17

(int)99.99999

Nó sẽ là 99. Việc truyền một nhân đôi đến một số nguyên không làm tròn, nó sẽ loại bỏ phần phân số.


11
Math.floor(n)

trong đó n là một đôi. Có vẻ như điều này thực sự sẽ trả về một số gấp đôi, vì vậy hãy đảm bảo rằng bạn đã đánh máy sau đó.


2
Không cần sàn trước khi cast, hãy xem câu trả lời của Xorlev.
Mizipzor

6
@miz: Tuy nhiên, ngữ nghĩa khác nhau đối với các số âm.
Joey



1

thử với cái này, cái này đơn giản

double x= 20.22889909008;
int a = (int) x;

this will return a=20

hoặc thử với cái này: -

Double x = 20.22889909008;
Integer a = x.intValue();

this will return a=20

hoặc thử với cái này: -

double x= 20.22889909008;
System.out.println("===="+(int)x);

this will return ===20

có thể những mã này sẽ giúp bạn.



0

Trong câu hỏi này:

1.Đóng đôi thành số nguyên là một nhiệm vụ rất dễ dàng.

2.Nhưng nó không làm tròn giá trị nhân đôi đến số thập phân gần nhất. Do đó, quá trình đúc có thể được thực hiện như sau:

double d=99.99999999;
int i=(int)d;
System.out.println(i);

và nó sẽ in 99, nhưng việc làm tròn vẫn chưa được thực hiện.

Do đó, để làm tròn số, chúng ta có thể sử dụng,

double d=99.99999999;
System.out.println( Math.round(d));

Điều này sẽ in đầu ra của 100.

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.