2013-04-07 3 views
0

Так что BigDecimal не может хранить числа, которые продолжаются бесконечно, как ответ на 1/3. Когда я попробовал это, я получаю следующее:BigDecimal Rounding

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 

Так что я решил использовать RoundingMode. Когда я делаю (1/3)*3, я хочу, чтобы он возвращался как 1, а не 0,9 или 0,99 или 0,999 или в любую форму. Однако, если бы я должен был сделать (1/3) * 2, я не хочу, чтобы округлить до 1.

ответ

0

Похоже, вам нужно округлять 1 знака после запятой, попробуйте следующее:

BigDecimal base = new BigDecimal("1.0"); 
BigDecimal result = base.divide(new BigDecimal("3"), 1, RoundingMode.HALF_UP); 

, а также читать документ here

+0

Это то, что я сделал. Я пытаюсь выяснить, как вернуть его к одному, если бы я умножал результаты на 3. – dalawh

+1

невозможно. когда вы делаете математику, вам нужно решить, нужен ли вам точный результат (без округления) или округленные результаты (и вы теряете точность). – 1ac0

0

Если вы округлите свой номер, вы потеряете информацию. С BigDecimal вы никогда не получите 1 с (1/3) * 3, если снова не закончите окончательный результат.

+0

Есть ли альтернатива BigDecimal, которая позволит мне получить 1, когда я сделаю (1/3) * 3, и получить 0.6667, когда я сделаю (1/3) * 2? – dalawh

+0

Лучшая альтернатива - ответ Медо42, я думаю. – WilQu

1

Если ваш делитель всегда 3, вы можете выполнить свою математику с целыми числами, увеличенными на 3, чтобы получить точные результаты, например. используйте 2 для представления 2/3 и используйте 1 для 1/3. Добавление их получит Вас 3, что означает 3/3 = 1.

Если вам нужны различные делители, но все еще работают только с числами, которые могут быть представлены фракциями, вы можете захотеть взглянуть на этот вопрос: Best way to represent a fraction in Java?

Если вам нужно точно представлять (и вычислять с) иррациональные числа (например, Pi или sqrt (2)), вам, вероятно, не повезло. См. Здесь: Irrational number representation in any programming language?