Java DecimalFormat未返回正确的数字

Java DecimalFormat未返回正确的数字,java,double,decimalformat,Java,Double,Decimalformat,下面是这个特殊赋值的提示:设x为任意实数。编写一个程序,用二分法()计算x的平方根。请注意,您应该将此问题简化为对a和b进行自然选择的二分法(即,用户不需要提供a和b)。请注意,不允许使用Math.pow和Math.sqrt 问题是,当我输入100(其根为“10.0”,但控制台返回“9.99999761581429”)或36(“6.0”,但控制台返回“5.9999997138977051”)等整数时,我没有得到正确的答案。我想这可能是因为我在对数字进行四舍五入,或者仅仅是因为我一般都使用了双精度

下面是这个特殊赋值的提示:设x为任意实数。编写一个程序,用二分法()计算x的平方根。请注意,您应该将此问题简化为对a和b进行自然选择的二分法(即,用户不需要提供a和b)。请注意,不允许使用
Math.pow
Math.sqrt

问题是,当我输入100(其根为“10.0”,但控制台返回“9.99999761581429”)或36(“6.0”,但控制台返回“5.9999997138977051”)等整数时,我没有得到正确的答案。我想这可能是因为我在对数字进行四舍五入,或者仅仅是因为我一般都使用了
双精度
,但我对编程中的数学不是很了解。谢谢你帮助我

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;
    }
}
导入java.text.DecimalFormat;
导入java.util.Scanner;
公共类二分法{
公共双a=0;
公共双b;
公共双用户输入;
公共整数迭代=0;
公共双中点;
公共静态void main(字符串[]args){
BisectionMethod testClass=新的BisectionMethod();
System.out.println(“答案:+testClass.FindAnswer(testClass.FindInput(),testClass.a,testClass.FindInterval());
}
公共双FindInput(){
扫描仪sc=新的扫描仪(System.in);
System.out.println(“输入数字以查找根:”);
userInput=sc.nextDouble();
while(userInput<0){
System.out.println(“请输入一个大于0:”)的数字;
userInput=sc.nextDouble();
}
sc.close();
返回用户输入;
}
公共双FindInterval(){
while(b*b
为了更好地理解编程中的数学,值得付出努力。查看这篇文章,因为它可能会解释为什么你会得到一些意想不到的值——可能比你意识到的要复杂一些。编程问题只需要坚持不懈地去解决,只要不断地去解决

改变

while (RoundNumber(difference) != 0) {
致:

或者与小ε比较:

while (Math.abs(difference) > 0.0000001) {

由于计算被四舍五入到小数点后4位,请尝试将结果四舍五入到小数点后4位。@Andreas哇,谢谢你的帮助!但是我真的不明白为什么你的代码在缩小解决方案的范围,每次迭代都越来越近。您让代码停止尝试一次
小于
0.00005
(四舍五入到4位小数==0),那么为什么您会对结果只精确到4位以上的小数感到困惑呢?我想使用
RoundNumber
函数,这样我也可以处理根不是整数的数字。例如,5的根是2.23606。。。但是如果我没有
RoundNumber
函数,控制台将不会返回任何内容。请使用epsilon值。例如:
while(Math.abs(difference)>0.0000001){
你可以把它做得尽可能小。@jspcal这就是
RoundNumber
的效果。从
RoundNumber
改为epsilon不会有太大的区别(除非它更快)。
while (Math.abs(difference) > 0.0000001) {