Z Java 11 BigDecimal
docs :
Gdy MathContext
obiekt jest dostarczany z ustawieniem dokładności 0 (na przykład MathContext.UNLIMITED
), operacje arytmetyczne są dokładne, podobnie jak metody arytmetyczne, które nie przyjmują MathContext
obiektu. (Jest to jedyne zachowanie obsługiwane w wersjach wcześniejszych niż 5.)
W następstwie obliczenia dokładnego wyniku ustawienie trybu zaokrąglania MathContext
obiektu z ustawieniem dokładności 0 nie jest używane, a zatem nie ma znaczenia. W przypadku dzielenia dokładny iloraz może mieć nieskończenie długie rozszerzenie dziesiętne; na przykład 1 podzielone przez 3.
Jeśli iloraz ma niekończące się rozwinięcie dziesiętne, a operacja jest podana w celu zwrócenia dokładnego wyniku, generowany ArithmeticException
jest znak an . W przeciwnym razie zwracany jest dokładny wynik podziału, tak jak w przypadku innych operacji.
Aby to naprawić, musisz zrobić coś takiego :
a.divide(b, 2, RoundingMode.HALF_UP)
gdzie 2 to skala, a RoundingMode.HALF_UP to tryb zaokrąglania
Aby uzyskać więcej informacji, zobacz ten post na blogu .
precision
; to jestscale
. Proszę zobaczyć docs.oracle.com/javase/7/docs/api/java/math/…Ponieważ nie określasz precyzji i trybu zaokrąglania. BigDecimal narzeka, że mógłby użyć 10, 20, 5000 lub miejsc dziesiętnych nieskończoności i nadal nie byłby w stanie podać dokładnej reprezentacji liczby. Zamiast więc podawać niepoprawny BigDecimal, po prostu drwi z ciebie.
Jeśli jednak podasz tryb RoundingMode i precyzję, będzie on w stanie przekonwertować (np. 1.333333333 na nieskończoność do czegoś takiego jak 1.3333 ... ale jako programista musisz powiedzieć mu, z jaką precyzją jesteś zadowolony „.
źródło
Możesz to zrobić
Możesz wybrać liczbę bitów 32 324 128.
Sprawdź ten link:
http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6&state=class&package=java.math&class=MathContext
źródło
Do rozwiązania takiego problemu użyłem poniższego kodu
2 to precyzja. Teraz problem został rozwiązany.
źródło
precision
; to jestscale
. Zobacz docs.oracle.com/javase/7/docs/api/java/math/...Miałem ten sam problem, ponieważ mój wiersz kodu to:
Przechodzę do tego, czytając poprzednią odpowiedź, ponieważ nie pisałem precyzji dziesiętnej:
4 to Precyzja dziesiętna
ORAZ RoundingMode to stałe Enum, możesz wybrać dowolną z nich
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
W tym przypadku HALF_UP będzie miał następujący wynik:
Możesz sprawdzić
RoundingMode
informacje tutaj: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/źródło
Problem polega na zaokrągleniu wyniku, dla mnie rozwiązanie jest następujące.
źródło
Odpowiedz na BigDecimal zgłasza wyjątek ArithmeticException
Dodaj obiekt MathContext do wywołania metody dzielenia i dostosuj tryb precyzji i zaokrąglania. To powinno rozwiązać twój problem
źródło
Twój program nie wie, jakiej precyzji użyć liczb dziesiętnych, więc rzuca:
Rozwiązanie w celu obejścia wyjątku:
źródło