JavaRush /Blog Java /Random-VI /Làm tròn số trong Java

Làm tròn số trong Java

Xuất bản trong nhóm
Số dấu phẩy động (float, double) được sử dụng khi tính toán các biểu thức yêu cầu độ chính xác thập phân. Độ chính xác cao thường cần thiết trong kế toán và các hoạt động tính toán khác. Làm tròn số trong Java - 1Nhưng có phải chúng ta luôn cần một “đuôi” số dài sau dấu thập phân? Có lẽ độ chính xác của ba phần thực là đủ đối với chúng ta? Và chúng tôi hài lòng với tùy chọn này, làm thế nào để thực hiện làm tròn đúng cách? Đây chính xác là những gì chúng ta sẽ nói hôm nay: chúng ta sẽ xem xét các cách làm tròn số trong Java .

Định dạng chuỗi

Là phương pháp đầu tiên, chúng ta sẽ xem xét làm tròn gấp đôi:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
Do đó, chúng tôi sẽ định dạng số dấu phẩy động 34766674 với độ chính xác là 3 chữ số thập phân , vì trong hướng dẫn định dạng, chúng tôi đã chỉ định ba chữ số thập phân "%.3f. Đổi lại, %f khi định dạng một chuỗi cho biết loại dấu phẩy động số, bao gồm kiểu dữ liệu doublefloat trong Java. Trong ví dụ trên, chúng ta xuất giá trị kết quả ra bảng điều khiển. Bây giờ câu hỏi đặt ra là: làm cách nào chúng ta có thể rút ngắn giá trị này? Rất đơn giản: bạn cần sử dụng printf, để sử dụng printf là định dạng + in. Do đó, ví dụ trước của chúng tôi sẽ được rút gọn thành:
double value = 34.766674;
System.out.printf("%.3f",value);
Ngoài phương thức này , phiên bản out của lớp PrintStream còn có một phương thức định dạng hoạt động tương tự:
double value = 34.766674;
System.out.format("%.3f",value);
Làm tròn xảy ra ở chế độ HALF_UP - hướng tới số gần với số bị cắt hơn (đến 0 hoặc 10). Nếu các số này cách đều nhau (trong trường hợp là 5) thì việc làm tròn sẽ được thực hiện lên. Ví dụ:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
Chúng ta sẽ thảo luận về các chế độ làm tròn chi tiết hơn dưới đây. Làm tròn số trong Java - 2

Định dạng thập phân

Một tùy chọn khác là sử dụng lớp DecimalFormat . Nó được thiết kế để định dạng bất kỳ số nào trong Java, có thể là số nguyên hoặc số dấu phẩy động. Khi chúng ta khởi tạo DecimalFormat, chúng ta có thể truyền cho nó một chuỗi định dạng. Nó sẽ cho biết cần định dạng bao nhiêu chữ số thập phân cho đầu vào. Đây là ví dụ của chúng tôi khi sử dụng DecimalFormat :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
Dòng #.### là mẫu cho biết chúng ta đang định dạng giá trị được truyền thành 3 chữ số thập phân. Để thay đổi mẫu sau khi đối tượng DecimalFormat được tạo, bạn có thể sử dụng các phương thức applyPatternapplyLocalizedPattern của nó :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
Nhưng hôm nay chúng ta đang nói về làm tròn, phải không? Khi cắt bớt một số có vị trí thập phân nằm ngoài mẫu đã chỉ định, DecimalFormat làm tròn số lên nếu số bị cắt cuối cùng lớn hơn 5. Nhưng nếu số đó là 5 thì sao? Hóa ra nó nằm chính xác ở giữa các số nguyên gần nhất. Vậy thì sao? Trong trường hợp này, số trước đó được tính đến. Nếu nó chẵn, việc làm tròn được thực hiện:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
Nếu lẻ, nó không được thực hiện:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
Có một chút khác biệt giữa việc định dạng số dấu phẩy động bằng String.format() và DecimalFormat.format(). Cái đầu tiên sẽ luôn in các số 0 ở cuối ngay cả khi không có phần phân số. Ví dụ:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
Như chúng ta có thể thấy, khi định dạng số 7.000132 thành ba chữ số thập phân, phương thức format() của String sẽ xuất ra 7.000, trong khi phương thức format() của DecimalFormat sẽ xuất ra 7. Tức là bạn có thể chọn String.format() hoặc DecimalFormat.format( ) tùy thuộc vào việc bạn có cần số 0 ở cuối hay không. Sử dụng các phương pháp được mô tả ở trên, chúng tôi đã nhận được kết quả ở dạng chuỗi. Hãy xem xét các cách để lấy lại chính xác các giá trị số.

Toán học

Không thể không kể đến một lớp đặc biệt được thiết kế riêng cho các phép tính số học khác nhau với các con số - Math . Làm tròn số trong Java - 3Lớp này cũng có các phương thức làm tròn, nhưng không giống như các phương thức đã được mô tả, chúng không cho phép bạn đặt một số vị trí thập phân nhất định mà làm tròn thành một số nguyên:
  • Math.ceil() làm tròn lên số nguyên gần nhất nhưng không trả về kiểu số nguyên mà trả về kiểu double:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    Ngay cả khi chúng ta có 34.0000000 thì sau khi sử dụng Math.ceil chúng ta vẫn sẽ nhận được 35.0.

    Math.floor() làm tròn xuống số nguyên gần nhất, đồng thời trả về kết quả là gấp đôi:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    Một lần nữa, ngay cả khi chúng ta có giá trị 34,999999999, thì sau khi sử dụng Math.floor chúng ta sẽ nhận được 34,0.

  • Math.round() – làm tròn đến số nguyên gần nhất, cho kết quả int:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    Nếu số của chúng ta là 34,5 thì nó được làm tròn thành 35, nhưng nếu nó nhỏ hơn 34,499 một chút thì số đó sẽ bị cắt ngắn xuống còn 34.

    Để không chỉ cắt bỏ toàn bộ phần thực mà còn để điều chỉnh quá trình này đến một số chữ số thập phân nhất định, đồng thời, số đó được nhân với 10^n (10 lũy thừa của n), trong đó n bằng số chữ số thập phân cần thiết. Sau đó, một số phương thức của lớp Math được sử dụng để làm tròn và sau đó lại chia cho 10^n:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - nhận hai đối số. Đầu tiên là con số, thứ hai là sức mạnh cần nâng lên.

Làm tròn với BigDecimal

BigDecimal là lớp cho phép bạn làm việc với các số dấu phẩy động. Đặc biệt, tính năng chính của nó là có thể lưu trữ các số phân số có độ dài tùy ý (nghĩa là không có giới hạn về phạm vi của số). Ngoài ra, lớp này còn lưu trữ nhiều phương thức khác nhau để xử lý số học, bao gồm cả làm tròn. Lớp của đối tượng này có thể được tạo bằng cách đặt hàm tạo thành double, chuỗi để hiển thị số dấu phẩy động, double và MathContext , v.v. MathContext là sự kết hợp giữa RoundingMode và một số mô tả tổng số chữ số trong giá trị được tìm kiếm. Quy tắc làm tròn Chế độ làm tròn: XUỐNG - làm tròn về 0. UP —làm tròn từ chế độ 0. TRẦN - làm tròn về phía dương vô cực. FLOOR - làm tròn về phía âm vô cực. HALF_UP - Làm tròn đến "hàng xóm gần nhất" nếu cả hai hàng xóm không cách đều nhau (nghĩa là khi số được làm tròn là 5). Trong trường hợp này, việc làm tròn được thực hiện. HALF_DOWN - làm tròn về phía “hàng xóm gần nhất”. Nếu cả hai hàng xóm không cách đều nhau, trong trường hợp này hãy làm tròn xuống. HALF_EVEN - Làm tròn tới "hàng xóm gần nhất" nếu cả hai hàng xóm không cách đều nhau. Trong trường hợp này, hãy làm tròn đến hàng xóm chẵn (như trong DecimalFormat được mô tả ở trên). KHÔNG CẦN THIẾT - Được sử dụng để xác nhận rằng thao tác được yêu cầu có kết quả chính xác. Vì vậy, việc làm tròn là không cần thiết. Ví dụ:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
Ngoài khả năng đặt quy tắc làm tròn trong hàm tạo, BigDecimal cho phép bạn đặt chế độ làm tròn sau khi phiên bản được tạo. Để thực hiện việc này, hãy sử dụng phương thức setScale , trong đó bạn cần đặt số vị trí thập phân và quy tắc làm tròn:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal cũng có các biến int bên trong được thiết kế để đặt chế độ làm tròn ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...) Đây là các quy tắc làm tròn tương tự như các quy tắc được trình bày trong lớp RoundingMode và được sử dụng tương tự trong setScale :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
Đọc thêm về lớp BigDecimal trong bài viết này .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION