2012-03-29 33 views
6

Tôi không thể tìm thấy lý do tại sao tôi nhận được java.lang.ArithmeticException: Invalid operation khi sử dụng số thập phân lớn.java BigDecimal arithmaticException hoạt động không hợp lệ

public static String E (int exponent, String value){ 
BigDecimal ten= new BigDecimal("10"); 
BigDecimal tempValue=new BigDecimal (value); 
return tempValue.multiply(ten.pow(exponent)).toString(); 
} 

Một số số mũ có giá trị như -27. Có cách nào xung quanh điều này vì nó sẽ rất khó để lưu trữ các giá trị ban đầu với nhiều số không. Tôi đã chọn BigDecimal vì tôi cần chính xác.

Cảm ơn bạn

Trả lời

4

Nếu bạn đang nâng cao điều cần số mũ âm, bạn phải chỉ định một MathContext trong BigDecimal.pow(int, MathContext) để nó biết bao nhiêu chính xác để sử dụng - nếu không, BigDecimal sẽ cố gắng tính toán nó cho chính xác vô hạn, đó là không thể cho một số giá trị.

(Trừ khi bạn có thể hoàn toàn chắc chắn rằng hoạt động bạn đang làm có kết quả chính xác với một số hữu hạn các chữ số.)

+0

tôi hoàn toàn chắc chắn rằng nó không có độ chính xác vô hạn. Tôi vẫn nhận được lỗi đó mặc dù. Sử dụng double sẽ không đạt được như xa trong khi một số hoạt động thực hiện có xu hướng được thực hiện gần 0. Tôi không thấy làm thế nào 10 để tắt một cái gì đó có thể là một độ chính xác vô hạn và một máy tính khoa học có thể giữ giá trị lên đến -99. Nếu không sẽ có một cách tốt hơn để đại diện cho điều này? –

+0

Bạn có thể cho chúng tôi dấu vết ngăn xếp của ngoại lệ không? –

+1

@ErrorMessages 'pow (int)' sẽ, khi đưa ra một số âm, ném một ArithmeticException. Luôn luôn. http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#pow%28int%29 – Joni

2

Để nhân một BigDecimal bởi một sức mạnh của 10 nó có thể rõ ràng hơn để các người đọc (và hiệu quả hơn nữa) để sử dụng movePointLeftmovePointRight:

Thay vì tempValue.multiply(ten.pow(exponent)) bạn sẽ sử dụng tempValue.movePointRight(exponent).

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