Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用BigDecimal递增for循环?_Java_Bigdecimal - Fatal编程技术网

Java 如何使用BigDecimal递增for循环?

Java 如何使用BigDecimal递增for循环?,java,bigdecimal,Java,Bigdecimal,因此,在编码方面,我或多或少是个笨蛋。我正在为一门大学课程学习java,我的一个练习要求我编写一个代码,使用左端点法、中点法和梯形法计算积分 为此,我需要使用一个每次递增一步的For循环。我知道如何使用double实现这一点,但问题是,当我使用double数据类型运行计算时,它会给我舍入错误。在阅读了大部分关于堆栈溢出的其他问题后,我想我应该使用BigDecimal来消除舍入错误 然而,使用BigDecimal会给我带来一大堆错误。据我所知,我不能使用诸如,==等普通运算符,因为BigDecim

因此,在编码方面,我或多或少是个笨蛋。我正在为一门大学课程学习java,我的一个练习要求我编写一个代码,使用左端点法、中点法和梯形法计算积分

为此,我需要使用一个每次递增一步的For循环。我知道如何使用double实现这一点,但问题是,当我使用double数据类型运行计算时,它会给我舍入错误。在阅读了大部分关于堆栈溢出的其他问题后,我想我应该使用BigDecimal来消除舍入错误

然而,使用BigDecimal会给我带来一大堆错误。据我所知,我不能使用诸如,==等普通运算符,因为BigDecimal不是一种基本数据类型。但是我不知道如何做一个基本的for循环,它在使用BigDecimal的同时递增。我在这里看到的另一件事建议使用Commons数学?第二个答案是否定的

我根本不知道如何使用它,因为据我所知,它与普通的import java.lang.Math不同

所以我想我的问题是,我如何让我的代码在for循环中使用BigDecimal来工作,以及如何将数字进行比较,或者如何使用普通数学来简单地避免舍入错误

这是我的密码:

import java.util.Scanner;
import java.lang.Math;
import java.math.BigDecimal;

public class IntegrationMethods{

  //calculates the value of the function f(x)=x^2
  public static BigDecimal f(BigDecimal x){
    return x.multiply(x);
  }

  //uses a, b and N as arguments, calculates sum of integral using left 
endpoint rule
  public static BigDecimal leftEndpoint(BigDecimal a, BigDecimal b, 
BigDecimal n){
    BigDecimal h = (b.subtract(a)).divide(n);
    sum = new BigDecimal("0");
    i = new BigDecimal("0");
    for(i.compareTo(n)<=0;){
      sum = sum.add(h.multiply(f(a.add(h.multiply(i-1)))));
      i = i.add(new BigDecimal(1));
    }
    return sum;
  }

  public static BigDecimal midpoint(BigDecimal a, BigDecimal b, BigDecimal 
n){
    BigDecimal h = (b.subtract(a)).divide(n);
    BigDecimal sum = 0.0;
    for(BigDecimal i=0.0; i<n; i++){
      BigDecimal x1 = a.add(h.multiply(i));
      BigDecimal x2 = a.add(h.multiply(i+1));
      sum = sum.add(h.multiply((f(x1).add(f(x2))).divide(2)));
    }
    return sum;
  }

  public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);

System.out.println("Please enter the lower limit of integration a.");
BigDecimal a = scanner.nextBigDecimal();

System.out.println("Please enter the upper limit of integration b.");
BigDecimal b = scanner.nextBigDecimal();

//swaps a and b so that the bigger of the two is always b.
//this prevents a negative popping up later on.
if(b<a){
  BigDecimal r = a;
  BigDecimal m = b;
  a = m;
  b = r;
}

System.out.println("Please enter the number of sampling points N.");
BigDecimal n = scanner.nextBigDecimal();

//checks if n is greater than or equal to 1, and asks for a new value if it isn't.
while (n<1.0){
  System.out.println("Please enter a new value for N.");
  n = scanner.nextBigDecimal();
}

System.out.println("For " + n + " intervals, the integral of x^2 using the left endpoint rule is: " + leftEndpoint(a,b,n));
System.out.println("Using the midpoint rule, the integral of x^2 is: " + midpoint(a,b,n));
  }
}

从0到19计数的正常循环是:

for (int i = 0; i < 20; i++)
    System.out.println(i);
使用,==etc和BigDecimal的方法是使用以下方法。javadoc展示了如何做到这一点:


对于六个布尔比较运算符中的每一个,>=,!=,此方法优先于单独的方法 从0到19计数的正常循环是:

for (int i = 0; i < 20; i++)
    System.out.println(i);
使用,==etc和BigDecimal的方法是使用以下方法。javadoc展示了如何做到这一点:

对于六个布尔比较运算符中的每一个,>=,!=,此方法优先于单独的方法 for循环的每一部分都可以有您想要的任何表达式。第一个初始化变量,第二个必须计算为布尔值,第三个是任意表达式。例如:

for (BigDecimal i = BigDecimal.ZERO; i.compareTo(n) < 0; i = i.add(BigDecimal.ONE)) {
}
for循环的每一部分都可以有您想要的任何表达式。第一个初始化变量,第二个必须计算为布尔值,第三个是任意表达式。例如:

for (BigDecimal i = BigDecimal.ZERO; i.compareTo(n) < 0; i = i.add(BigDecimal.ONE)) {
}

使用像BigDecimal这样的浮点值作为循环计数器是个坏主意,因为它可能导致意外行为。您可以在此处阅读更多有关内容:

如果将for循环计数器设置为int类型,则只需将其包装在新的BigDecimal实例中,以传递给h.multiply并生成预期结果:

for(int i=0; BigDecimal.of(i).compareTo(n) < 0; i++){
  BigDecimal x1 = a.add(h.multiply(BigDecimal.of(i)));
  BigDecimal x2 = a.add(h.multiply(BigDecimal.of(i+1)));
  sum = sum.add(h.multiply((f(x1).add(f(x2))).divide(2)));
}

使用像BigDecimal这样的浮点值作为循环计数器是个坏主意,因为它可能导致意外行为。您可以在此处阅读更多有关内容:

如果将for循环计数器设置为int类型,则只需将其包装在新的BigDecimal实例中,以传递给h.multiply并生成预期结果:

for(int i=0; BigDecimal.of(i).compareTo(n) < 0; i++){
  BigDecimal x1 = a.add(h.multiply(BigDecimal.of(i)));
  BigDecimal x2 = a.add(h.multiply(BigDecimal.of(i+1)));
  sum = sum.add(h.multiply((f(x1).add(f(x2))).divide(2)));
}

为什么要尝试使用浮点值作为循环计数器?诀窍是读取BigDecimal的javadoc。我想主要是因为n。我在一次计算中使用了它,所以它也必须是BigDecimal,然后for循环中的所有其他内容也必须是BigDecimal,否则我会得到一个错误的操作数类型错误。BigDecimal是为金钱计算而设计的。对于物理/数学量,只需使用double。通过将较小的项与较大的项相加来避免舍入误差。我不仅仅是在相加,我还在乘法和平方运算,这是我得到舍入误差的时候。我最初所有的东西都是双精度的,那是在我切换到BigDecimal的时候,我如何避免那里的舍入错误呢?你为什么要尝试使用浮点值作为循环计数器呢?诀窍是读取BigDecimal的javadoc。我想主要是因为n。我在一次计算中使用了它,所以它也必须是BigDecimal,然后for循环中的所有其他内容也必须是BigDecimal,否则我会得到一个错误的操作数类型错误。BigDecimal是为金钱计算而设计的。对于物理/数学量,只需使用double。通过将较小的项与较大的项相加来避免舍入误差。我不仅仅是在相加,我还在乘法和平方运算,这是我得到舍入误差的时候。我最初把所有东西都放在双精度上,那是当我切换到BigDecimal时,我如何避免那里的舍入错误呢?I.addBigDecimal.ONE什么都不做。有关正确的循环,请参阅。@Andreas谢谢您的帮助。现在应该修好了。i.addBigDecimal.ONE什么都不做。有关正确的循环,请参阅。@Andreas谢谢您的帮助。现在应该修复了。我使用的n也是BigDecimal,所以当我编译它时会出现一个错误,表示操作数类型不正确。你给出的链接不适用于BigDecimal,但我同意你的建议,作为一个良好的实践点。int I=0.0不会编译。BigDecimal不是一个近似值
ate浮点值,在循环中使用BigDecimal是可以的。@Andreas修复了int i=0.0,谢谢@LiziHutchinson我将更新我的解决方案,以说明n是一个BigDecimal。但我使用的n也是一个BigDecimal,因此当我编译它时,这最终给了我一个错误,表示操作数类型错误。您提供的链接不适用于BigDecimal,但我同意你的建议,因为这是一个良好的实践点。int I=0.0将无法编译。BigDecimal不是一个近似的浮点值,在循环中使用BigDecimal是可以的。@Andreas修复了int I=0.0,谢谢@LiziHutchinson我将更新我的解决方案,以说明n是一个大的十进制数。我理解Javadoc,每个人似乎都认为我没有或没有读过它,我的主要问题是比较compareTo给出的整数值,如果您认为需要将compareTo返回的int值与n值进行比较,那么您显然不理解javadoc。javadoc显式地显示了仅将int值与0进行比较。再次阅读javadoc。int值的大小没有意义。只知道值是==0、<0还是>0。@LiziHutchinson这是对我不知道如何在仍然使用BigDecimal的情况下执行递增的基本for循环的回答,以及*我如何让代码工作*在for循环中使用BigDecimal,以及在通常情况下比较数字*。这不是你要问的吗?对不起,我一直在编辑我的代码,我现在明白你的意思了。我有时还是有点搞混了。如果我想将一个BigInteger除以2,我可以执行Int1.dividenew BigInteger int2=2吗?或者我必须以操作方式声明int2吗?@LiziHutchinson对于BigInteger,而不是BigDecimal,最好使用shift:bi=bi.shiftRight1进行除法。要除以某个整数值,请使用bi=bi.dividebiginger.valueOfintValue。如果你多次除以同一个整数值,例如在循环中,你应该将biginger.valueOfintValue赋值给循环外的一个变量。我理解Javadoc,每个人似乎都认为我没有或没有读过它,我的主要问题是比较compareTo给出的整数值,如果您认为需要将compareTo返回的int值与n值进行比较,那么您显然不理解javadoc。javadoc显式地显示了仅将int值与0进行比较。再次阅读javadoc。int值的大小没有意义。只知道值是==0、<0还是>0。@LiziHutchinson这是对我不知道如何在仍然使用BigDecimal的情况下执行递增的基本for循环的回答,以及*我如何让代码工作*在for循环中使用BigDecimal,以及在通常情况下比较数字*。这不是你要问的吗?对不起,我一直在编辑我的代码,我现在明白你的意思了。我有时还是有点搞混了。如果我想将一个BigInteger除以2,我可以执行Int1.dividenew BigInteger int2=2吗?或者我必须以操作方式声明int2吗?@LiziHutchinson对于BigInteger,而不是BigDecimal,最好使用shift:bi=bi.shiftRight1进行除法。要除以某个整数值,请使用bi=bi.dividebiginger.valueOfintValue。如果多次除以同一整数值,例如在循环中,则应将BigInteger.ValueOfInValue分配给该循环外的变量。