2017-02-09 38 views
1

Практика с использованием BigDecimal в первый раз. Мой главный выход метод должен быть:Вывод BigDecimal не содержит точных десятичных значений?

Площадь круга с радиусом 8.5949958is: 232.081671383290563028029402608911005665488497019210725540793500930304148269265220664195247142820189371870652494944664567810832522809505462646484375

Площадь круга с радиусом 3.440393959403938E7is: 3718483500498323.66662697460176592346057689232315135847190735857072463126614392248114882022491656243801116943359375

однако, что это не то, Распечатать редактор Я получаю значение

232.081671383290555535978683110442943871021270751953125 

для круга одного и значение 3718483500498323.563695 для круга два. Коллега сообщил мне, что мне нужно использовать BigDecimals для каждого значения, чтобы результат был точным, но у меня создается впечатление, что я уже это делаю.

import java.math.BigDecimal; 
public class Circle 
{ 
private BigDecimal radius = new BigDecimal("0.0"); 

public Circle() 
{ 
    setRadius(0.0); 
} 
public void setRadius(double r) 
{ 
    this.radius = new BigDecimal(r); 
} 
public BigDecimal findCircleArea(double radius) 
{ 
    this.setRadius(radius); 
    BigDecimal Pi = new BigDecimal("3.14159"); 
    BigDecimal rad = new BigDecimal(Math.pow(radius, 2.0)); 
    BigDecimal a = Pi.multiply(rad); 

    return a; 
} 

} 

Merge, если вам нужно, но я посмотрел вокруг и не смогли найти ответ, это действительно расстраивает меня.

+0

Это хорошая загадка. Я лично не знаю, как получить эти цифры, если это не непонимание задачи. – Andremoniy

ответ

0

Я думаю, что вы неправильно понимаете свою задачу или что-то пропустили во входных данных. Я могу доказать это легко на математической основе.

Рассмотрите один из первых примеров: на входе у вас есть значение, равное 8.5949958. Даже без умножения этого числа на себя (квадрат) мы можем оценить максимальное количество цифр в его дробной части: оно не может быть больше 14 цифр, потому что 10^-7 * 10^-7 = 10^-14. Если мы примем его как BigDecimal значение и квадрат, мы получим:

BigDecimal rad = BigDecimal.valueOf(radius).pow(2); 

=73.87395280201764 которой точное значение площади данного входа. То есть здесь нет потери точности.

Перейти на следующий этап. Затем вы умножаете этот номер на 3.14159. Опять же, используя тот же подход, мы можем оценить максимальное количество цифр в значимой дробной части: оно не может быть больше 19 цифр, так как 10^-5 * 10^-14 = 10^-19. Давайте сделаем это умножение:

BigDecimal a = Pi.multiply(rad);

=232.0816713832905976476 - 19 цифр. Таким образом, мы не потеряли никакой точности здесь.

Из этого следует, что эти длинные номера, которые вы ожидаете на выходе, просто не могут быть получены для данного входа. Или вы пропускаете что-то во входных данных, или это ошибка в задаче.

+0

Возможно, что основная основная (написанная моим профессором) неверна. Круг c = новый круг(); double r1 = 8.5949958; System.out.println («Площадь круга с радиусом» + r1 + «is:»); System.out.println (c.findCircleArea (r1)); System.out.println(); double r2 = 34403939.594039382; System.out.println («Площадь круга с радиусом» + r2 + «is:»); System.out.println (c.findCircleArea (r2)); – bbotezatu

0

Чтобы получить все эти цифры точности, вам необходимо как можно скорее преобразовать значения double в BigDecimals, так как значения double, являющиеся неточными, содержат «скрытые» дополнительные цифры, которые будут способствовать шкале результата. Избегайте использования строк и не выполняйте математику double.

По сути, это изменить:

BigDecimal Pi = new BigDecimal("3.14159"); 
BigDecimal rad = new BigDecimal(Math.pow(radius, 2.0)); 

к этому:

BigDecimal Pi = new BigDecimal(3.14159); 
BigDecimal rad = new BigDecimal(radius).pow(2); 
+0

Он не должен менять инициализацию 'Pi' от' String' до 'double', и он должен указать намного больше цифр. – EJP

+0

@EJP В идеале да, но он оставил этот комментарий на удаленном ответе: «Профессор, который назначил это мне, дал указание использовать только 3.14159 для этой проблемы; Я пробовал это с Math.PI, и у меня был еще более неточный ответ. Он отметил, что я найду правильный ответ, используя 3.14159 ». – VGR

Смежные вопросы