2013-12-07 2 views
2

Я разделил 124/13. но приложение принудительно закрылось. это мой код:BigDecimal не вычисляет divide

Float x =Float.valueOf(a.getText().toString()); 
Float y =Float.valueOf(b.getText().toString()); 
BigDecimal xx= new BigDecimal (x); 
BigDecimal yy= new BigDecimal (y); 
BigDecimal rx= xx.divide(yy); 
res.setText("=" + rx); 
+0

На какой линии (ов)/являются ошибки (s) происходит? – skiwi

+0

Не существует приложения error.the, которое принудительно закрывается и .... но в 120/10 он правильно отвечает – amirmamed

+0

В следующий раз, если вы действительно не можете отлаживать ошибку с Android, сначала проверьте, работает ли ваш кодовый блок (если он не требует Android framework) даже в нормальной Java. – skiwi

ответ

1

Вы столкнулись:

java.lang.ArithmeticException: Non-terminating decimal expansion; 
    no exact representable decimal result. 

Рассмотрим следующий пример, который будет yeld точной исключением:

BigDecimal x = new BigDecimal(1); 
BigDecimal y = new BigDecimal(3); 
BigDecimal result = x.divide(y); 

Это потому, что нет точного представления 0.3333(3). Что вам нужно сделать, это указать округление и точность:

BigDecimal result = x.divide(y, 10 /*scale*/, RoundingMode.HALF_UP); 
System.out.println(result); //will print "0.3333333333" 

Также обратите внимание, что вы должны создать BigDecimal непосредственно из String, поскольку float не является точным представлением. Рассмотрим это:

String s = "0.123456789"; 
System.out.println(Float.parseFloat(s)); //prints 0.12345679 
System.out.println(new BigDecimal(s)); //prints 0.123456789 

Это может быть так, что вы хотите, приблизительный результат. Тогда просто пойти с float или double только:

dobule x = Double.parseDouble(a.getText()); 
dobule y = Double.parseDouble(b.getText()); 
res.setText("=" + (x/y)); 
3

Вполне возможно, что приложение рушится, потому что BigDecimal.toString() делает что-то неожиданное. Также a, или b или rx может быть null.

В любом случае, я бы рассмотреть возможность использования BigDecimal с String конструктора, так что никаких ошибок округления не происходит:

String x = a.getText().toString(); 
String y = b.getText().toString(); 
BigDecimal xx = new BigDecimal(x); 
BigDecimal yy = new BigDecimal(y); 
BigDecimal rx = xx.divide(yy); 
res.setText("=" + rx.toPlainString()); 

написать Также new BigDecimal(x) вместо new BigDecimal (x). Обратите внимание на опущенное пространство, это может быть причиной того, что ваше приложение вылетает, оно не разрешено в Java.

+0

'new BigDecimal (x)' - совершенно легальный синтаксис Java (хотя он не рекомендуется [Code Conventions] (http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141388.html#682)) – rzymek

Смежные вопросы