2016-02-05 1 views
-1

У меня естьРасчеты без потери точности

BigDecimal a = new BigDecimal(7); 
    BigDecimal b = new BigDecimal(13); 
    BigDecimal c = new BigDecimal(26); 
    System.out.print((a.divide(b)).multiply(c)); 

этот код генерирует исключение:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 

Это означает, что мне нужно установить RoundingMode.

Но мне нужно получить результат только без потери точности.

Как я могу это достичь?

+7

Похоже, вы хотите работать с фракциями, а не с десятичными знаками. Вы можете осмотреть библиотеку с классом фракций или написать свой собственный. –

+0

Проверьте это: http://commons.apache.org/proper/commons-math/userguide/fraction.html Здесь также обсуждается: http://stackoverflow.com/questions/474535/best-way- to-Represent-a-fraction-in-java – mohammedkhan

+0

@ Давид Уоллес благодарит вас - вы правы – gstackoverflow

ответ

1

Увидимся как 7/13, продолжая бесконечность, о чем вы просите, не представляется возможным. Ваш единственный возможный вариант - иметь большую точность при делении.

0

Разделение 7 на 13 даст вам длинный и нескончаемый десятичный знак (0.538461 53846 .....). Поэтому вам нужно установить предел точности. Попробуйте следующее:

a.divide(b, x, RoundingMode.HALF_UP).multiply(c) 

где x - предел точности, который вы хотите установить.

Javadocs говорит:

Когда объект MathContext поставляется с точностью установки 0 (например, MathContext.UNLIMITED), арифметические операции являются точными, как и арифметические методы, которые не принимают Объект MathContext. (Этот является единственным поведением, которое было поддержано в версиях до 5.)

Как следствие вычисления точного результата, настройка объекта MathContext с точностью установкой 0 режима округления не используются и таким образом, не имеет значения. В случае деления точный коэффициент может иметь бесконечно длинное десятичное расширение; например, 1 , деленный на 3.

+2

Это решит исключение, но вопросник нуждается в количестве до высокой точности, это побеждает цель. – mohammedkhan

0

Десятичные числа 7/3 идут в бесконечность. Вы должны окружить его AFAIK. Вы можете сохранить 6 знаков после запятой, потому что первые 6 мест повторяется бесконечно

http://m.wolframalpha.com/input/?i=7%2F13