Из документов Java 11BigDecimal
:
Когда MathContext
объекту присваивается значение точности 0 (например, MathContext.UNLIMITED
), арифметические операции являются точными, как и арифметические методы, которые не принимают MathContext
объект. (Это единственное поведение, которое поддерживалось в выпусках до 5.)
Как следствие вычисления точного результата, настройка режима округления MathContext
объекта с точностью настройки 0 не используется и, таким образом, не имеет значения. В случае деления точный фактор может иметь бесконечно длинное десятичное разложение; например, 1 делится на 3.
Если частное имеет неопределенное десятичное разложение, и указана операция для получения точного результата, генерируется значение ArithmeticException
. В противном случае возвращается точный результат деления, как и для других операций.
Чтобы исправить, вам нужно сделать что-то вроде этого :
a.divide(b, 2, RoundingMode.HALF_UP)
где 2 - масштаб, а RoundingMode. HALF_UP - режим округления.
Для более подробной информации смотрите этот пост в блоге .
precision
; этоscale
. Пожалуйста, смотрите docs.oracle.com/javase/7/docs/api/java/math/…Потому что вы не указываете точность и режим округления. BigDecimal жалуется, что может использовать 10, 20, 5000 или десятичные знаки бесконечности, и все равно не сможет дать вам точное представление числа. Так что вместо того, чтобы давать вам неправильный BigDecimal, он просто жалуется на вас.
Однако, если вы укажете RoundingMode и точность, он сможет преобразовать (например, 1.333333333 в бесконечность во что-то вроде 1.3333 ... но вы, как программист, должны сказать, с какой точностью вы «довольны» ».
источник
Ты можешь сделать
Вы можете выбрать желаемое количество битов либо 32,64,128.
Проверьте эту ссылку:
http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6&state=class&package=java.math&class=MathContext
источник
Для решения такой проблемы я использовал приведенный ниже код
2 - это точность. Теперь проблема была решена.
источник
precision
; этоscale
. Пожалуйста, смотрите docs.oracle.com/javase/7/docs/api/java/math/…У меня была такая же проблема, потому что моя строка кода была:
Я перехожу на это, читая предыдущий ответ, потому что я не писал десятичную точность:
4 - десятичная дробь
И RoundingMode являются константами Enum, вы можете выбрать любой из этих
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
В этом случае HALF_UP будет иметь такой результат:
Вы можете проверить
RoundingMode
информацию здесь: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/источник
Это вопрос округления результата, решение для меня следующее.
источник
Ответ для BigDecimal бросков ArithmeticException
Добавьте объект MathContext в свой вызов метода деления и настройте точность и режим округления. Это должно исправить вашу проблему
источник
Ваша программа не знает, какую точность для десятичных чисел использовать, поэтому выдает:
Решение обойти исключение:
источник