2009-05-29 53 views
23

Tại sao mã này đôi khi trả về 1E + 1 trong khi các đầu vào khác (ví dụ: 17) đầu ra không được in theo ký pháp khoa học?Tại sao Java BigDecimal trả về 1E + 1?

BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros(); 
System.out.println("value: " + bigDecimal); 

Trả lời

39

sử dụng bigDecimal.toPlainString():

BigDecimal bigDecimal = BigDecimal.valueOf(100000.0) 
        .multiply(BigDecimal.valueOf(100d)) 
        .stripTrailingZeros(); 
System.out.println("plain  : " + bigDecimal.toPlainString()); 
System.out.println("scientific : " + bigDecimal.toEngineeringString()); 

kết quả đầu ra:

 
plain  : 10000000 
scientific : 10E+6 
+0

+1 để cung cấp giải pháp thực tế thay vì "đây là vấn đề" như tôi đã làm. :) –

+0

Câu trả lời như thế này là điều khiến Stackoverflow trở nên tuyệt vời –

7

Đó là .toString() chuyển đổi ngầm đang xảy ra khi bạn vượt qua kết quả vào System.out.println().

+0

+1 để chỉ ra vấn đề – dfa

3

Lý do chính xác cho các hành vi của BigDecimal.toString() được giải thích trong API doc trong lớn (và gần không thể hiểu được) chi tiết.

Để có được đại diện văn bản nhất quán (và vị ngữ nhạy cảm), bạn nên sử dụng DecimalFormat.

3

Về cơ bản là vì bạn không có đủ số chữ số đáng kể. Nếu bạn nhân một cái gì đó mà chỉ có 1 chữ số đáng kể với 100, sau đó bạn nhận được một cái gì đó với chỉ có 1 chữ số đáng kể. Nếu nó cho thấy "10" sau đó về cơ bản nói rằng nó có 2 chữ số đáng kể. Cách hiển thị nó chỉ có 1 chữ số có nghĩa là hiển thị "1 x 10^1".

Hai thập phân sau có giá trị như nhau (10), nhưng "quy mô" khác nhau (trong đó họ bắt đầu đếm chữ số có nghĩa; đầu có 2 trái vả sig, phía dưới có 1):

System.out.println(new BigDecimal(BigInteger.TEN, 0)); // prints 10 
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1 
Các vấn đề liên quan