2012-07-31 25 views
5

Tôi nhận được kết quả sai khi sử dụng phương pháp bên dưới.Nhận kết quả sai để đánh giá 100 * 2.55 giá trị

public double evaluate(final double leftOperand, final double rightOperand) { 
     Double rtnValue = new Double(leftOperand * rightOperand); 
     return rtnValue.doubleValue(); 
    } 

Nhập giá trị thông số là: leftOperand = 100 và rightOperand = 2,55

Tôi nhận được câu trả lời sai: 254,99999999999997

Câu trả lời đúng là một 255,0

+4

buộc "Tất cả những gì khoa học máy tính nên biết về Floating-Point Arithmetic" -Link: http://docs.sun.com/source/806-3568/ncg_goldberg.html – Jacob

+1

gì * chính xác * giá trị làm bạn tin rằng giá trị của bạn "2.55" có? –

+0

@JonSkeet: Ngay cả khi bạn biết giá trị chính xác của cả hai 2,55 và 100,0, câu trả lời sẽ là sai ... –

Trả lời

4

Đây là do floating point precision problem. Không thể đại diện cho mọi số hữu tỉ trong vòng 64 bit. Các số được lưu trữ trong số IEEE 754 format.

Nếu bạn đang tạo ra một trò chơi, điều này là quá đủ, thậm chí nổi sẽ làm. Nhưng nếu bạn đang làm một số tài chính, nó phải là chính xác. Sau đó, bạn có thể sử dụng java.math.BigDecimal. Nó chậm hơn nhiều so với double nhưng nó là chính xác. Và nó mất nhiều bộ nhớ hơn, vì bạn có một giá trị chính xác trong bộ nhớ. Đây là hướng dẫn hay về cách sử dụng BigDecimal.

+0

Cảm ơn, thông tin của bạn rất hữu ích. – iMBMT

-1

Sử dụng Math.round().

public static double evaluate(final double leftOperand, final double rightOperand) { 
     Double rtnValue = new Double(leftOperand * rightOperand); 
     return Math.round(rtnValue.doubleValue()); 
    } 
Các vấn đề liên quan