2016-04-06 47 views
0

Java'da bigdecimal kullanarak yuvarlanmaya çalışıyorum ve sonlandırılmayan ondalık genişleme gösteren bir java.lang.ArithmeticException hatasında çalışıyordum.BigDecimal ile Yuvarlama?

Hataların kaynağını, java'da oldukça yeni olduğumdan herkes açıklayabilir mi? ve koduma yardım et i hata doğan inanıyoruz nerede

Teşekkür

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

değişkeni "d" dir.

+0

'yeni BigDecimal (String.valueOf (e))' olmalıdır [ 'BigDecimal.valueOf (e) '] (https://docs.oracle.com /javase/7/docs/api/java/math/BigDecimal.html#valueOf%28long%29). – Andreas

+0

@Andreas, yeni bir referans yeri oluşturmak ve fazladan bellek alanı açmak yerine, exp tarafından referans verilen değerin yerini alıyor mu? – TheLiquor

+0

@ TheLiquor Ana neden, e 'bir“ int ”olduğundan, bir“ int ”(ya da“ long ”) 'un bir BigDecimal'e dönüştürülmesi kolay ve hızlıdır, fakat * formatlama *' '' '' '' '' sonra * bir BigDecimal için ayrıştırma * yavaş ve savurgan. – Andreas

cevap

1

Bölmeyi yaptığınızda ölçeği ayarlamanız gerekir.

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

Not: yuvarlama ile double kullanarak daha temiz ve daha az hata eğilimli olması muhtemeldir. `E` bir` int`, olduğu

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

Şu anda küçük sayılar kullanıyorum ama bir RSA şifreleyici yazıyorum, bu yüzden kullanılan primler çiftler kapasitesi için çok büyük olacak ama şimdi çok teşekkür ederim çok teşekkür ederim. – TheLiquor

+0

Soru değişikliği mi yaptınız? “e”, “çift” olarak değil, “int” olarak tanımlanır. "Int" olarak, ['BigDecimal.valueOf (uzun)'] özelliğini kullanmalısınız (https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#valueOf%28long% 29). Eğer bir "çifte" olsaydı, kesinlikle yeni BigDecimal (çift) 'yi kullanmamalısınız, ama ['BigDecimal.valueOf (double)'] (https://docs.oracle.com/javase/7/docs /api/java/math/BigDecimal.html#valueOf%28double%29). Yani, her iki durumda da, 'BigDecimal.valueOf() ', yeni BigDecimal()' üzerinden tercih edilir. – Andreas

+0

@ TheLiquor, neden bir RSA şifresi için 'BigDecimal' kullanmanız gerekiyor? Sadece tamsayılarla uğraşmak zorundasınız. –