BigDecimal不计算除法

时间:2013-12-07 17:52:56

标签: java

我分了124/13。但应用程序被迫关闭。 这是我的代码:

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);

2 个答案:

答案 0 :(得分:3)

应用可能会崩溃,因为BigDecimal.toString()会发生意外情况。此外,abrx可能为null

无论如何,我会考虑将BigDecimalString构造函数一起使用,以免出现舍入错误:

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中不允许这样做。

答案 1 :(得分:1)

您遇到过:

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

考虑这个例子,它会产生这个确切的异常:

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

可能是您想要近似结果的情况。然后只需使用floatdouble

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