Trong khi bạn có thể đã nghe nói về lỗi làm tròn, bạn có thể tự hỏi tại sao bạn có lỗi làm tròn ở đây.
float a1 = 1.4f;
float b1 = 0.5f;
double c1 = 1.4;
double d1 = 0.5;
System.out.println(new BigDecimal(a1) + " - " + new BigDecimal(b1) + " is " +
new BigDecimal(a1).subtract(new BigDecimal(b1)) + " or as a float is " + (a1 - b1));
System.out.println(new BigDecimal(c1) + " - " + new BigDecimal(d1) + " is " +
new BigDecimal(c1).subtract(new BigDecimal(d1)) + " or as a double is " + (c1 - d1));
in
1.39999997615814208984375 - 0.5 is 0.89999997615814208984375 or as a float is 0.9
1.399999999999999911182158029987476766109466552734375 - 0.5 is
0.899999999999999911182158029987476766109466552734375
or as a double is 0.8999999999999999
Như bạn có thể thấy, không float
cũng không double
thể đại diện cho các giá trị chính xác, và khi float hay double được in, một số làm tròn xảy ra để ẩn này từ bạn. Trong trường hợp này của float, làm tròn đến 7 chữ số thập phân cho số bạn mong đợi. Trong trường hợp gấp đôi có 16 chữ số chính xác, lỗi làm tròn hiển thị.
Là @Eric Postpischil, lưu ý xem hoạt động float
hoặc double
có lỗi làm tròn phụ thuộc hoàn toàn vào các giá trị được sử dụng hay không. Trong tình huống này, đó là phao có vẻ chính xác hơn, thậm chí thông qua giá trị được biểu diễn là từ 0,9 so với giá trị kép.
Tóm lại: nếu bạn định sử dụng float
hoặc double
, bạn nên sử dụng chiến lược làm tròn hợp lý. Nếu bạn không thể làm điều này, hãy sử dụng BigDecimal.
System.out.printf("a1 - b1 is %.2f%n", (a1 - b1));
System.out.printf("c1 - d1 is %.2f%n", (c1 - d1));
in
a1 - b1 is 0.90
c1 - d1 is 0.90
Khi bạn in một float hay double, nó giả định rằng giá trị thập phân ngắn gần nhất là một trong những bạn thực sự muốn. tức là trong vòng 0,5 ulp.
Ví dụ:
double d = 1.4 - 0.5;
float f = d;
System.out.println("d = " + d + " f = " + f);
in
d = 0.8999999999999999 f = 0.9
Tương tự như http://stackoverflow.com/questions/322749/retain-precision-with-doubles-in-java – tjg184
này có thể giúp http: //epramono.blogspot .com/2005/01/double-vs-bigdecimal.html – kosa
Xem thêm http://mindprod.com/jgloss/floatingpoint.html –