Java DecimalFormat未返回正确的数字
下面是这个特殊赋值的提示:设x为任意实数。编写一个程序,用二分法()计算x的平方根。请注意,您应该将此问题简化为对a和b进行自然选择的二分法(即,用户不需要提供a和b)。请注意,不允许使用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”)等整数时,我没有得到正确的答案。我想这可能是因为我在对数字进行四舍五入,或者仅仅是因为我一般都使用了双精度
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) {