Mam napisać program liczący metodą Newtona pierwiastek kwadratowy. Z uwagi na zakresy liczb musze uzywac BigDecimal.
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n = liczbaPierwiastkowana();
int k = dokladnosc();
BigDecimal x = BigDecimal.valueOf(1);
BigDecimal a = BigDecimal.valueOf(n);
do {
x = ((x.add(a.divide(x))).multiply(BigDecimal.valueOf(0.5)));
System.out.println(x);
} while (0 < x.setScale(k, BigDecimal.ROUND_DOWN).multiply(x.setScale(k, BigDecimal.ROUND_DOWN)).compareTo(a));
System.out.println(x);
}
static int liczbaPierwiastkowana() {
Scanner scan = new Scanner(System.in);
int n;
do {
System.out.println("Podaj liczbę z której chcesz wyciągnąć pierwiastek - liczbę całkowitą nieujemną, nie większą niż miliard:");
n = scan.nextInt();
} while (n < 0 || n > 1000000000);
return n;
}
static int dokladnosc() {
Scanner scan = new Scanner(System.in);
int k;
do {
System.out.println("Podaj żądąną dokładność wyniku - liczbę całkowitą nieujemną, nie większą niż 10 000.");
k = scan.nextInt();
} while (k < 0 || k > 10000);
return k;
}
Tutaj blad po uruchomieniu:
Podaj liczbę z której chcesz wyciągnąć pierwiastek - liczbę całkowitą nieujemną, nie większą niż miliard:
50
Podaj żądąną dokładność wyniku - liczbę całkowitą nieujemną, nie większą niż 10 000.
10
25.5
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.base/java.math.BigDecimal.divide(BigDecimal.java:1722)
at Main.main(Main.java:14)
Dodatkowo intellij skresla mi set scale i round down, nie bardzo rozumiem dlaczego.
Prosze o wyrozumialosc i dziekuje za pomoc!