DecimalFormat не возвращает правильный номер - PullRequest
0 голосов
/ 04 июня 2018

Вот подсказка для этого конкретного назначения: пусть x будет любым действительным числом.Напишите программу, которая вычисляет квадратный корень из x, используя метод деления пополам (https://docs.python.org/3/library/functions.html#format). * Обратите внимание, что вам следует свести эту проблему к методу деления пополам с естественным выбором a и b (т. Е. Пользователю не нужно предоставлятьa и b). Обратите внимание, что Math.pow и Math.sqrt недопустимы.

Проблема заключается в том, что я не получаю правильных ответов, когда вводю целые числа, например 100 (корень которого равен "10.0 ", но вместо этого консоль возвращает" 9.999997615814209 ") или 36 (" 6.0 ", но консоль возвращает" 5.999997138977051 "). Я думаю, что это может быть связано с тем, что я округляю числа, или просто с тем, что яиспользуя doubles в целом, но я не очень хорошо понимаю математику в программировании. Спасибо за помощь.

import java.text.DecimalFormat;
import java.util.Scanner;

public class BisectionMethod {

    public double a = 0;
    public double b;
    public double userInput;
    public int iteration = 0;
    public double midpoint;

    public static void main(String[] args) {
        BisectionMethod testClass = new BisectionMethod();
        System.out.println("Answer: " + testClass.FindAnswer(testClass.FindInput(), testClass.a, testClass.FindInterval()));
    }

    public double FindInput() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the number to find the root for: ");
        userInput = sc.nextDouble();
        while (userInput < 0) {
            System.out.println("Please enter a number bigger than 0: ");
            userInput = sc.nextDouble();
        }
        sc.close();
        return userInput;
    }

    public double FindInterval() {
        while (b * b < userInput) {
            b = b + 1;
        }
        return b;
    }

    public double RoundNumber(double number) {
        //Rounds number to 4 decimal places.
        String pattern = "#.####";
        DecimalFormat formatNumber = new DecimalFormat(pattern);
        double rounded = Double.valueOf(formatNumber.format(number));
        return rounded;
    }

    public double FindAnswer(double number, double interval1, double interval2) {

        midpoint = (interval1 + interval2) / 2;
        double difference = (midpoint * midpoint) - number;

        while (RoundNumber(difference) != 0) {
            midpoint = (interval1 + interval2) / 2;
            difference = (midpoint * midpoint) - number;
            if (midpoint * midpoint < number) {
                interval1 = midpoint;
            } else {
                interval2 = midpoint;
            }
            iteration = iteration + 1;
        }
        System.out.println("Iterations: " + iteration);
        return midpoint;
    }
}

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Изменить

while (RoundNumber(difference) != 0) {

На:

while (difference != 0) {

Или сравнить с небольшим эпсилоном:

while (Math.abs(difference) > 0.0000001) {
0 голосов
/ 04 июня 2018

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

Double против BigDecimal?

...