2011-12-13 69 views
8

tôi có một loạt các Java thập phân như:Làm thế nào để cắt bỏ thập phân trong Java KHÔNG làm tròn?

0.43678436287643872 
0.4323424556455654 
0.6575643254344554 

tôi muốn cắt đứt tất cả mọi thứ sau 5 chữ số thập phân. Sao có thể như thế được?

+1

Về mặt kỹ thuật, không có: hành vi cắt đứt các chữ số thập phân hơn nữa * là * tròn, chỉ bạn luôn làm tròn xuống 5 chữ số thập phân. Xem câu trả lời bên dưới để biết các tùy chọn của bạn. – Piskvor

+1

bạn có muốn kết quả là một Chuỗi hoặc một số không? –

+0

Tôi muốn kết quả là một số – Zubair

Trả lời

23

Nếu bạn muốn giữ mọi thứ nhanh chóng và đơn giản. ;)

public static void main(String... args) { 
    double[] values = {0.43678436287643872, 0.4323424556455654, 0.6575643254344554, 
      -0.43678436287643872, -0.4323424556455654, -0.6575643254344554, 
      -0.6575699999999999 }; 

    for (double v : values) 
     System.out.println(v + " => "+roundDown5(v)); 
} 

public static double roundDown5(double d) { 
    return (long) (d * 1e5)/1e5; 
} 

// Or this. Slightly slower, but faster than creating objects. ;) 
public static double roundDown5(double d) { 
    return Math.floor(d * 1e5)/1e5; 
} 

in

0.43678436287643874 => 0.43678 
0.4323424556455654 => 0.43234 
0.6575643254344554 => 0.65756 
-0.43678436287643874 => -0.43678 
-0.4323424556455654 => -0.43234 
-0.6575643254344554 => -0.65756 
-0.6575699999999999 => -0.65756 
+2

Giải pháp tuyệt vời! Đơn giản và phức tạp. Tôi thích nó! thx – nowaq

+0

Đây có thể là giải pháp tốt nhất!Tôi chỉ cố gắng tìm ra bất kỳ vấn đề nào với nó trước khi tôi chấp nhận nó! – Zubair

+0

Điều gì về -0,657569, điều đó tạo ra -0,65756? – Zubair

17
float f = 0.43678436287643872; 
BigDecimal fd = new BigDecimal(f); 
BigDecimal cutted = fd.setScale(5, RoundingMode.DOWN); 
f = cutted.floatValue(); 
+0

Sẽ không làm tròn số thập phân cuối cùng này? OP muốn tránh điều đó. – tobiasbayer

+0

HALF_UP không chính xác. có thể là "XUỐNG"? – Kent

+0

Có, DOWN, tất nhiên. – Artem

7
Double.parseDouble(String.valueOf(x).substring(0,7)); 

HOẶC

Double.valueOf(String.valueOf(x).substring(0,7)); 

nơi x chứa giá trị bạn muốn cắt như 0.43678436287643872

+0

Bạn có thể chỉnh sửa câu trả lời thay vì đăng nhận xét. –

+0

@Piskvor: Sai lầm của tôi. Tôi không đếm "0.". Đã chỉnh sửa. – Kris

+0

@HarryJoy: Cảm ơn bạn đã đề xuất – Kris

6

Các DecimalFormat cũng có thể hỗ trợ ở đây:

double d = 0.436789436287643872; 
    DecimalFormat df = new DecimalFormat("0.#####"); 
    df.setRoundingMode(RoundingMode.DOWN); 

    double outputNum = Double.valueOf(df.format(d)); 
    String outpoutString = df.format(d); 
1

tôi sẽ làm điều đó với biểu thức thông thường như thế này:

double[] values = { 
      0.43678436287643872, 
      0.4323424556455654, 
      0.6575643254344554, 
      -0.43678436287643872, 
      -0.4323424556455654, 
      -0.6575643254344554 
    }; 

    Pattern p = Pattern.compile("^(-?[0-9]+[\\.\\,][0-9]{1,5})?[0-9]*$"); 
    for(double number : values) { 
     Matcher m = p.matcher(String.valueOf(number)); 
     boolean matchFound = m.find(); 
     if (matchFound) { 
      System.out.println(Double.valueOf(m.group(1))); 
     } 
    } 

Các mô hình có thể dễ dàng sửa đổi nếu bạn cần hỗ trợ nhiều hơn/ít chữ số thập phân hơn.

1

Để khái quát Peter trả lời bạn có thể làm:

public static double round(double n, int decimals) { 
    return Math.floor(n * Math.pow(10, decimals))/Math.pow(10, decimals); 
} 
Các vấn đề liên quan