2013-02-08 44 views
16

Chạy chương trình này rất đơn giản:Tại sao BigDecimal mới ("0.0"). StripTrailingZeros() có thang tỷ lệ 1?

public static void main(final String... args) 
{ 
    System.out.println(BigDecimal.ZERO.scale()); 
    System.out.println(new BigDecimal("0").scale()); 
    System.out.println(new BigDecimal("0.0").stripTrailingZeros().scale()); 
    System.out.println(new BigDecimal("1.0").stripTrailingZeros().scale()); 
} 

kết quả đầu ra:

0 
0 
1 
0 

Câu hỏi của tôi là khá đơn giản: tại sao không phải là thứ ba println đầu ra 0? Điều đó sẽ có vẻ hợp lý ...

EDIT: OK, vì vậy, đây là một lỗi rất cũ:

Bug Link

và trong thực tế, nó là "tác phẩm" cho bất kỳ số zero: new BigDecimal("0.0000").stripTrailingZeroes().scale() là 4!

+1

bản sao có thể có của [Làm rõ hành vi của BigDecimal.stripTrailingZeroes()] (http://stackoverflow.com/questions/5239137/clarification-on-behavior-of-bigdecimal-striptrailingzeroes) –

+2

Câu hỏi mà Andrew đang liên kết đến là thực sự giống nhau, nhưng lưu ý rằng câu trả lời được chấp nhận là không chính xác. Hành vi bạn thấy là lỗi được đề cập trong câu trả lời khác: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6480539 – jarnbjo

Trả lời

8

Trong thực tế "0.0" là ngoại lệ vì nó không có stripTrailingZeroes. Lỗi!

public static void main(final String... args) { 
    p("0"); 
    p("0.0"); 
    p("1.0"); 
    p("1.00"); 
    p("1"); 
    p("11.0"); 
} 

private static void p(String s) { 
    BigDecimal stripped = new BigDecimal(s).stripTrailingZeros(); 
    System.out.println(s + " - scale: " + new BigDecimal(s).scale() 
     + "; stripped: " + stripped.toPlainString() + " " + stripped.scale()); 
} 

0 - scale: 0; stripped: 0 0 
0.0 - scale: 1; stripped: 0.0 1 
1.0 - scale: 1; stripped: 1 0 
1.00 - scale: 2; stripped: 1 0 
1 - scale: 0; stripped: 1 0 
11.0 - scale: 1; stripped: 11 0 

cố định trong Java 8! Xem nhận xét của @ vadim_shb.

+4

Đó là lỗi đã biết: http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=6480539 –

+1

@AaronDigulla lol, lỗi từ năm 2006. Và sẽ chỉ được sửa trong 'Java 8'. – Andremoniy

+3

@Andremoniy: Đừng tin vào nó ;-) –

Các vấn đề liên quan