Làm cách nào tôi có thể cắt bớt một số kép xuống chỉ còn hai chữ số thập phân trong Java?


93

Ví dụ: tôi có biến 3.545555555, tôi muốn cắt bớt biến chỉ còn 3.54.


18
Đây KHÔNG phải là một bản sao. Cắt bớt và làm tròn là hai việc hoàn toàn khác nhau.
markthegrea

Đồng ý, không biết tại sao điều này được gắn cờ là trùng lặp.
Bassinator

Câu trả lời:


144

Nếu bạn muốn điều đó cho mục đích hiển thị, hãy sử dụng java.text.DecimalFormat:

 new DecimalFormat("#.##").format(dblVar);

Nếu bạn cần nó để tính toán, hãy sử dụng java.lang.Math:

 Math.floor(value * 100) / 100;

50
Điều này sẽ không hiển thị 3,545555555 bị cắt ngắn thành 3,54, nhưng được làm tròn thành 3,55. DecimalFormat.setRoundsMode () cần được đặt thành RoundingMode.FLOOR;
Christian García

9
điều này không hiệu quả với tôi Math.floor (9,62 * 100) / 100 cho kết quả 9,61
Mani

4
Sử dụng floorđể cắt ngắn chỉ hoạt động đối với các giá trị dương.
Dev

3
@ ChristianGarcía Rút gọn được thực hiện đúng với RoundingMode.DOWNnhư RoudingMode.FLOORluôn vòng về phía vô cực âm.
Dev

46
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

Kiểm tra có sẵn RoundingModeDecimalFormat.


Không giải quyết Câu hỏi, yêu cầu cắt bớt thay vì làm tròn.
Basil Bourque

8
@BasilBourque RoundingMode.DOWN bị cắt bớt. So sánh với các câu trả lời khác đề xuất không chính xác chức năng tầng (tầng chỉ cắt bớt số dương), câu trả lời này hoạt động chính xác cho cả giá trị âm và dương.
Dev

1
@Dev Tôi đứng sửa lại. Tôi thấy bây giờ điều DOWNđó thực sự có tác dụng cắt bớt cho cả số dương và số âm. Như đã thấy trong bảng ví dụ trong tài liệu .
Basil Bourque

23

Bit Old Forum, Không có câu trả lời nào ở trên phù hợp với cả giá trị âm và dương (ý tôi là đối với phép tính và chỉ để thực hiện cắt ngắn mà không làm tròn). Từ Làm thế nào để làm tròn một số đến những nơi n chữ số thập phân trong Java liên kết

private static BigDecimal truncateDecimal(double x,int numberofDecimals)
{
    if ( x > 0) {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR);
    } else {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING);
    }
}

Phương pháp này làm việc tốt cho tôi.

System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));

Các kết quả :

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00

đây là câu trả lời có thể mở rộng cho nhiều trường hợp thử nghiệm hơn
diego matos - keke 13/02

trả về mới BigDecimal (x) .setScale (numberofDecimals, RoundingMode.DOWN) .doubleValue ();
Shimon Doodkin


9

Trước tiên, hãy lưu ý rằng a doublelà một phân số nhị phân và không thực sự chữ số thập phân.

Nếu bạn cần vị trí thập phân, hãy sử dụng a BigDecimal, có một setScale()phương thức để cắt ngắn hoặc sử dụng DecimalFormatđể lấy a String.


7

Nếu vì bất cứ lý do gì, bạn không muốn sử dụng, BigDecimalbạn có thể doublechuyểnint để cắt ngắn nó.

Nếu bạn muốn cắt ngắn đến vị trí của Ones :

  • chỉ cần truyền đến int

Đến vị trí thứ mười :

  • nhân với mười
  • truyền đến int
  • truyền trở lại double
  • và chia cho mười.

Địa điểm Hundreths

  • nhân và chia cho 100, v.v.

Thí dụ:

static double truncateTo( double unroundedNumber, int decimalPlaces ){
    int truncatedNumberInt = (int)( unroundedNumber * Math.pow( 10, decimalPlaces ) );
    double truncatedNumber = (double)( truncatedNumberInt / Math.pow( 10, decimalPlaces ) );
    return truncatedNumber;
}

Trong ví dụ này, decimalPlacessẽ là số nơi QUÁ KHỨ những nơi bạn muốn đi, vì vậy 1 sẽ tròn đến phần mười chỗ, 2 đến trăm , và vân vân (0 vòng đến những nơi, và một tiêu cực đến hàng chục , Vân vân.)


3
Đây là một giải pháp chung khủng khiếp . Cả phép nhân và phép ghép đều sẽ loại bỏ dữ liệu và dẫn đến kết quả là các số ngẫu nhiên nếu unroundedNumberđủ lớn. Nó có thể phù hợp với ví dụ trong câu hỏi, nhưng một giải pháp chung sẽ phù hợp với bất kỳ giải pháp nào double.
blm

4

Định dạng dưới dạng một chuỗi và chuyển đổi trở lại thành đôi, tôi nghĩ sẽ mang lại cho bạn kết quả bạn muốn.

Giá trị kép sẽ không tròn (), floor () hoặc ceil ().

Một cách khắc phục nhanh chóng cho nó có thể là:

 String sValue = (String) String.format("%.2f", oldValue);
 Double newValue = Double.parseDouble(sValue);

Bạn có thể sử dụng sValue cho mục đích hiển thị hoặc newValue để tính toán.


1
Nó làm tròn đối với tôi đến giá trị gần nhất. Ví dụ: 0,018 được chuyển đổi thành 0,02 khi tôi làm điều này.
karan patel

3

Có thể Math.floor(value * 100) / 100? Lưu ý rằng các giá trị như 3.54có thể không được đại diện chính xác bằng a double.


3

Bạn có thể sử dụng đối tượng Lớp NumberFormat để hoàn thành nhiệm vụ.

// Creating number format object to set 2 places after decimal point
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);            
nf.setGroupingUsed(false);

System.out.println(nf.format(precision));// Assuming precision is a double type variable

3

3.545555555 để có được 3.54. Hãy thử theo dõi điều này:

    DecimalFormat df = new DecimalFormat("#.##");

    df.setRoundingMode(RoundingMode.FLOOR);

    double result = new Double(df.format(3.545555555);

Điều này sẽ cho = 3,54!


1

Đây là phương pháp tôi sử dụng:

double a=3.545555555; // just assigning your decimal to a variable
a=a*100;              // this sets a to 354.555555
a=Math.floor(a);      // this sets a to 354
a=a/100;              // this sets a to 3.54 and thus removing all your 5's

Điều này cũng có thể được thực hiện:

a=Math.floor(a*100) / 100;

0

Có thể sau:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  

Xem các câu trả lời khác. Bạn không thể làm điều đó một cách đáng tin cậy nếu câu trả lời được biểu diễn bằng dấu phẩy động.
Marquis of Lorne,

0

Kiểm tra nhanh là sử dụng phương pháp Math.floor. Tôi đã tạo một phương pháp để kiểm tra một nhân đôi cho hai hoặc ít chữ số thập phân dưới đây:

public boolean checkTwoDecimalPlaces(double valueToCheck) {

    // Get two decimal value of input valueToCheck 
    double twoDecimalValue = Math.floor(valueToCheck * 100) / 100;

    // Return true if the twoDecimalValue is the same as valueToCheck else return false
    return twoDecimalValue == valueToCheck;
}

-1

Tôi có một phiên bản sửa đổi một chút của Mani .

private static BigDecimal truncateDecimal(final double x, final int numberofDecimals) {
    return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_DOWN);
}

public static void main(String[] args) {
    System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(3.545555555, 2));

    System.out.println(truncateDecimal(9.0, 2));
    System.out.println(truncateDecimal(-9.62, 2));
    System.out.println(truncateDecimal(-9.621, 2));
    System.out.println(truncateDecimal(-9.629, 2));
    System.out.println(truncateDecimal(-9.625, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));
    System.out.println(truncateDecimal(-3.545555555, 2));

}

Đầu ra:

0.00
9.62
9.62
9.62
9.62
9.99
9.00
3.54
-9.62
-9.62
-9.62
-9.62
-9.99
-9.00
-3.54

-2

Điều này đã làm việc cho tôi:

double input = 104.8695412  //For example

long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;

//result == 104.87

Cá nhân tôi thích phiên bản này vì nó thực sự thực hiện làm tròn số, thay vì chuyển đổi nó thành Chuỗi (hoặc tương tự) và sau đó định dạng nó.


1
Câu hỏi ban đầu là về việc cắt bớt, không làm tròn. Ngoài ra, việc chuyển đổi từ đôi thành dài sẽ không hoạt động tốt chút nào nếu đôi đủ lớn.
blm

-2
//if double_v is 3.545555555
String string_v= String.valueOf(double_v);
int pointer_pos = average.indexOf('.');//we find the position of '.'
string_v.substring(0, pointer_pos+2));// in this way we get the double with only 2 decimal in string form
double_v = Double.valueOf(string_v);//well this is the final result

điều này có thể hơi khó xử nhưng tôi nghĩ nó có thể giải quyết được vấn đề của bạn :)


Mã này hoàn thành công việc, nhưng nó không thanh lịch và có hiệu suất kém. Nó có thể ổn trong các dự án trường học, nhưng chắc chắn không phải là giải pháp mà ai đó sẽ sử dụng trong sản xuất cho bất kỳ hệ thống nào, trừ khi bạn muốn đau đầu sau này.
cbaldan
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.