2016-04-06 11 views
0

私はJavaでbigdecimalを使って丸めようとしていて、非終入小数の展開を表示しているjava.lang.ArithmeticExceptionエラーが発生しています。BigDecimalで丸めますか?

私はかなりJavaに新しいので、誰もエラーの原因を説明できますか?私のコードを助けてくれますか?私は、エラーが生じていると考えているところ

おかげ

protected BigDecimal p; 
protected BigDecimal q; 
protected BigDecimal d; 
protected BigDecimal det; 
protected BigDecimal exp; 
protected int e; 

    this.p = pq.getP(); 
    this.q = pq.getQ(); 

    det = ((p.subtract(BigDecimal.ONE)).multiply(q.subtract(BigDecimal.ONE))); 
    exp = new BigDecimal(String.valueOf(e)); 

    d = (det.divide(exp).setScale(2,BigDecimal.ROUND_HALF_UP)); 

変数 "d" があります。

+0

https://docs.oracle.com(e'は 'int'、'新規のBigDecimal(String.valueOf(E)) '[' BigDecimal.valueOf(E)]であるべきであるので ' /javase/7/docs/api/java/math/BigDecimal.html#valueOf%28long%29)。 – Andreas

+0

@Andreasは、新しい参照場所を作成して余分なメモリ空間を占有する代わりに、expが参照する値を置き換えるだけです。 – TheLiquor

+0

@ TheLiquor 'int'は' int'なので、BigDecimalに変換するのは簡単で高速ですが、 'int'を文字列にフォーマットして、 BigDecimalへの*解析*は遅く無駄です。 – Andreas

答えて

1

分割するときに縮尺を設定する必要があります。

d = det.divide(exp, 2, BigDecimal.ROUND_HALF_UP); 

注:四捨五入でdoubleを使用してはクリーンでエラーが発生しにくい可能性があります。

exp = new BigDecimal(e); // does the same thing if e is an int 
+0

私は今は小さな数字を使用していますが、RSA暗号を書いているので、使用される素数は倍精度の容量では大きすぎます。 – TheLiquor

+0

質問が変更になりましたか? 'e'は' double'ではなく 'int'として定義されます。 'int'として、[' BigDecimal.valueOf(long) '](https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#valueOf%28long%)を使うべきです。 29)。もしそれが 'double'だったのであれば、' new BigDecimal(double) 'ではなく' [BigDecimal.valueOf(double) '](https://docs.oracle.com/javase/7/docs)を使うべきです。 /api/java/math/BigDecimal.html#valueOf%28double%29)。つまり、どちらの場合でも、 'BigDecimal.valueOf()'は 'new BigDecimal()'よりも優先されます。 – Andreas

+0

@ TheLiquorなぜRSA暗号に 'BigDecimal'を使用する必要がありますか?あなたは整数だけを扱うべきです。 –