2013-12-07 2 views
2

저는 124/13로 나눕니다. 그러나 앱은 강제로 닫혔다. 이 내 코드입니다 : BigDecimal.toString() 예기치 않은 무언가를하기 때문에BigDecimal에서 나눗셈을 계산하지 않습니다.

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

입니다 :이 그럼 그냥 float 또는 double 만 갈? – skiwi

+0

앱이 강제로 닫히지 않고 오류가 발생하지 않습니다. 하지만 120/10에서 정확하게 대답합니다 – amirmamed

+0

다음 번에 Android에서 오류를 디버그 할 수없는 경우 먼저 코드 블록 (Android 프레임 워크가 필요하지 않은 경우)이 일반 Java에서 실행 중인지 확인하십시오. – skiwi

답변

1

님 발생했습니다 :

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

는,이 예제를 고려하는 것이다 yeld이 정확한 예외 :

0.3333(3)의 더 정확한 표현이 없기 때문에입니다
BigDecimal x = new BigDecimal(1); 
BigDecimal y = new BigDecimal(3); 
BigDecimal result = x.divide(y); 

. 당신이해야 할 일은 이 지정하는 것입니다 반올림 및 정밀도 :


BigDecimal result = x.divide(y, 10 /*scale*/, RoundingMode.HALF_UP); 
System.out.println(result); //will print "0.3333333333" 
는 또한 float은 정확한 표현이 아니다 당신이, String에서 직접 BigDecimal를 만들어야 있습니다. 이것을 고려하십시오 :

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

그것은 당신이 대략적인 결과를 원하는 경우가 있습니다./오류 (들)이 일어나고있는 무슨 라인 (들)에

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

앱이 충돌하는 것으로 보인다. 또한 a 또는 b 또는 rxnull 일 수 있습니다.

어떤 방법으로, 나는 더 반올림 오류가 발생하지 않도록는 String 생성자 BigDecimal 사용을 고려합니다 :

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 구문입니다 ([코드 규칙] (http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141388.html#682)에서 권장하지 않음). – rzymek

관련 문제