Định dạng nổi đến n vị trí thập phân


220

Tôi cần định dạng một dấu phẩy đến "n" vị trí thập phân.

đã cố gắng để BigDecimal, nhưng giá trị trả về không chính xác ...

public static float Redondear(float pNumero, int pCantidadDecimales) {
    // the function is call with the values Redondear(625.3f, 2)
    BigDecimal value = new BigDecimal(pNumero);
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30)
    return value.floatValue(); // but here the values is 625.3
}

Tôi cần trả về giá trị float với số vị trí thập phân mà tôi chỉ định.

Tôi có cần Floattrả lại giá trị khôngDouble

.

Câu trả lời:


561

Bạn cũng có thể vượt qua giá trị float và sử dụng:

String.format("%.2f", floatValue);

Tài liệu


70
Xin hãy cẩn thận vì String.format phụ thuộc vào cấu hình Cục bộ hiện tại của bạn, bạn có thể không nhận được dấu chấm làm dấu phân cách. Thích sử dụngString.format(java.util.Locale.US,"%.2f", floatValue);
Gomino

6
câu trả lời này cho giá trị Chuỗi, không phải giá trị Float, tôi không nghĩ câu trả lời hay.
ZhaoGang 17/03/2017

3
Tại sao bạn buộc một dấu chấm làm dấu phân cách?
Đánh dấu Buikema

1
@MarkBuikema Tôi nghĩ rằng có những trường hợp thực sự cần thiết, chẳng hạn như khi biên dịch các định dạng tài liệu được điều khiển bởi các tiêu chuẩn, ví dụ. Tài liệu PDF.
Tjaart

39

Hãy xem DecimalFormat . Bạn có thể dễ dàng sử dụng nó để lấy một số và đặt cho nó một số vị trí thập phân.

Chỉnh sửa : Ví dụ


1
+1. Đây là tài liệu dành riêng cho Android , về cơ bản là giống nhau.
Zach L

nhưng tôi cần kết quả là một số float, không phải là một chuỗi.
seba123neo

Bạn đang nói bạn muốn làm tròn phao? Thông thường độ chính xác thời gian duy nhất của một vấn đề nổi là để hiển thị.
Nick Campion

xin lỗi, bạn nói đúng, tôi đã nhầm lẫn, chỉ định dạng số khi hiển thị trên màn hình chứ không phải trước đó, đó là câu hỏi của tôi, cảm ơn bạn rất nhiều, vấn đề đã được giải quyết.
seba123neo

Lưu ý, việc sử dụng hàm DecimalFormattạo không được khuyến khích, hãy xem câu trả lời của tôi để sử dụng đúng NumberFormat.
FBB

17

Hãy thử điều này đã giúp tôi rất nhiều

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);

Kết quả sẽ là roundfinalprice -> 5652,26


2
Điều này hữu ích hơn cho những người muốn làm tròn và thực hiện một số tính toán tiếp theo với nó, nếu không, câu trả lời của Arve có lẽ là tốt nhất.
Gerard

Điều này cũng hoạt động với GWT. String.format () - không.
AlexV

15

Lưu ý, sử dụng hàm DecimalFormattạo không được khuyến khích. Các javadoc cho lớp này nói:

Nói chung, không gọi trực tiếp các hàm tạo DecimalFormat, vì các phương thức nhà máy NumberFormat có thể trả về các lớp con khác ngoài DecimalFormat.

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

Vì vậy, những gì bạn cần làm là (ví dụ):

NumberFormat formatter = NumberFormat.getInstance(Locale.US);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue));

Điều này không hoạt động khi (ví dụ) floatValue = 8.499. Nó đang cho 8,5.
Shiva krishna Chippa 19/03/18

3
@ShivakrishnaChippa: có, bởi vì ở đây chúng tôi xác định rằng chúng tôi muốn có 2 chữ số sau dấu phẩy và để làm tròn số. Trong trường hợp đó, 8.499 được làm tròn thành 8,5. Nếu bạn muốn 8.499 được hiển thị, chỉ cần đặt 3 là các chữ số phân số tối đa.
FBB

6

Đây là một mẫu nhanh bằng cách sử dụng DecimalFormatlớp được đề cập bởi Nick.

float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));

Đầu ra của câu lệnh in sẽ là 12,35. Lưu ý rằng nó sẽ làm tròn nó cho bạn.


Lưu ý, việc sử dụng hàm DecimalFormattạo không được khuyến khích, hãy xem câu trả lời của tôi để sử dụng đúng NumberFormat.
FBB

5

Kinda ngạc nhiên không ai chỉ ra cách trực tiếp để làm điều đó, đủ dễ dàng.

double roundToDecimalPlaces(double value, int decimalPlaces)
{
      double shift = Math.pow(10,decimalPlaces);
      return Math.round(value*shift)/shift;
}

Khá chắc chắn rằng điều này không làm tròn nửa chẵn.

Đối với những gì nó có giá trị, làm tròn nửa chẵn sẽ trở nên hỗn loạn và không thể đoán trước bất cứ khi nào bạn trộn các giá trị dấu phẩy động dựa trên nhị phân với số học cơ số 10. Tôi khá chắc chắn rằng nó không thể được thực hiện. Vấn đề cơ bản là giá trị như 1.105 không thể được biểu diễn chính xác bằng dấu phẩy động. Giá trị dấu phẩy động sẽ có dạng như 1.105000000000001 hoặc 1.104999999999999. Vì vậy, bất kỳ nỗ lực nào để thực hiện làm tròn một nửa chẵn sẽ gặp phải các lỗi mã hóa đại diện.

Việc triển khai dấu phẩy động của IEEE sẽ thực hiện nửa vòng, nhưng chúng thực hiện nửa vòng tròn nhị phân, không thực hiện nửa vòng thập phân. Vì vậy, bạn có thể ok


Tôi cũng đã sử dụng phương pháp này trong một thời gian, nhưng tôi sẽ nghĩ rằng đó powlà một hoạt động quá tốn kém để sử dụng để làm tròn?
Xerus

Không bao giờ tối ưu hóa cho đến khi bạn thực sự có một vấn đề hiệu suất. Quan trọng hơn là phải nhanh hơn. Và tôi không thể tưởng tượng một cách trung thực một ứng dụng mà hiệu suất làm tròn được kiểm soát sẽ là một vấn đề, trừ khi bạn là Visa hoặc Mastercard (người sẽ ném nhiều máy hơn vào đó). Và pow () có lẽ nhanh hơn round ().
Robin Davies

2
public static double roundToDouble(float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
    }

2

Đây là một cách ít chuyên nghiệp hơn và tốn kém hơn nhiều nhưng nó sẽ dễ hiểu và hữu ích hơn cho người mới bắt đầu.

public static float roundFloat(float F, int roundTo){

    String num = "#########.";

    for (int count = 0; count < roundTo; count++){
        num += "0";
    }

    DecimalFormat df = new DecimalFormat(num);

    df.setRoundingMode(RoundingMode.HALF_UP);

    String S = df.format(F);
    F = Float.parseFloat(S);

    return F;
}

1

Tôi nghĩ bạn muốn gì

return value.toString();

và sử dụng giá trị trả về để hiển thị.

value.floatValue();

sẽ luôn trả về 625.3 vì nó chủ yếu được sử dụng để tính toán một cái gì đó.


nhưng tôi cần kết quả là một số float, không phải là một chuỗi.
seba123neo

2
nếu bạn cần một float để hiển thị nó cho người dùng, có thể có điều gì đó không đúng với thiết kế của ứng dụng. Thông thường float được sử dụng để tính toán và một chuỗi được sử dụng để hiển thị nó cho người dùng.
n3utrino

xin lỗi, bạn nói đúng, tôi đã nhầm lẫn, chỉ định dạng số khi hiển thị trên màn hình chứ không phải trước đó, đó là câu hỏi của tôi, cảm ơn bạn rất nhiều, vấn đề đã được giải quyết.
seba123neo

1

Tôi đã tìm kiếm một câu trả lời cho câu hỏi này và sau đó tôi đã phát triển một phương pháp! :) Một cảnh báo công bằng, nó làm tròn giá trị.

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
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.