Java 如何使用BigDecimal来提高此方法的准确性?

Java 如何使用BigDecimal来提高此方法的准确性?,java,precision,bigdecimal,Java,Precision,Bigdecimal,我编写了以下简单函数,用于计算整数的逆的弧tan。我想知道如何使用BigDecimal而不是double来提高结果的准确性。我还考虑使用BigInteger来存储“term”值除以的xSquare的不断增长的倍数 对于如何在大小数上执行计算,我在语法方面的经验有限。如何修改此函数以使用它们 /*感谢您对一般计算方法的解释 归功于约翰·梅辛。 */ BigDecimal提供了非常直观的包装方法来提供所有不同的操作。您可以使用类似于此的任意精度,例如,99: publicstaticvoidmain

我编写了以下简单函数,用于计算整数的逆的弧tan。我想知道如何使用BigDecimal而不是double来提高结果的准确性。我还考虑使用BigInteger来存储“term”值除以的xSquare的不断增长的倍数

对于如何在大小数上执行计算,我在语法方面的经验有限。如何修改此函数以使用它们

/*感谢您对一般计算方法的解释 归功于约翰·梅辛。 */


BigDecimal提供了非常直观的包装方法来提供所有不同的操作。您可以使用类似于此的任意精度,例如,99:

publicstaticvoidmain(字符串[]args){
系统输出println(atanInvInt(5,99));
// 0.197395559849880758370049765194790293447585103787852101517688940241033969978243785732697828037288045
}
公共静态双十进制atanInvInt(整数x,整数比例){
BigDecimal one=新的BigDecimal(“1”);
BigDecimal 2=新的BigDecimal(“2”);
BigDecimal xVal=新的BigDecimal(x);
BigDecimal xSquare=xVal.multiply(xVal);
BigDecimal除数=新的BigDecimal(1);
BigDecimal结果=1.divide(xVal,scale,RoundingMode.FLOOR);
BigDecimal项=1.divide(xVal,scale,RoundingMode.FLOOR);
大十进制中间结果;
while(term.compareTo(新的BigDecimal(0))>0){
term=term.divide(X平方、比例、舍入模式、楼层);
除数=除数。加(二);
midResult=结果.减法(术语.除法(除数,刻度,取整模式.下限));
term=term.divide(X平方、比例、舍入模式、楼层);
除数=除数。加(二);
结果=中间结果.add(术语.divide(除数,刻度,取整模式.FLOOR));
if(除数比较到(新的BigDecimal(2101))>=0){
返回结果.add(中间结果).divide(二,比例,舍入模式.楼层);
}
}
返回结果;
}

对于任何想知道为什么一开始就提出这个问题是有益的人来说:这是一个公平的问题。我已经写了一个相当长的答复。我相信写下这个答案有助于我向自己阐明关于BigDecimal类的事情,现在我有了Armando Carballo的答案,比以前更加直观,所以写下这个答案很有教育意义。我只能希望阅读它也会是一样的,尽管可能会以不同的方式,如果有的话

官方文档列出了这些方法,但没有解释它们是如何以Armando Carballo的代码演示的方式使用的。例如,虽然BigDecimal.divide方法的工作方式非常直观,但官方文档中没有任何说明要获取两个数字的平均值,不仅要为这两个数字设置BigDecimal,还应创建一个等于2的BigDecimal,并将BigDecimal.divide方法应用于BigDecimal.add操作的结果,其中2 BigDecimal作为除数的输入这是一种非常简单的方法,一旦你看到它,它就会非常直观,但是如果你以前从未使用过面向对象的方法来执行算术,那么当你第一次试图找出如何取平均值时,它可能就不那么直观了

作为另一个例子,考虑一个数字是大于或等于另一个数的想法,而不是在两个数上使用布尔运算符,你使用一个CopeReto方法,它可以在一个数上给出三个可能的输出,而另一个数作为输入,然后将布尔运算符应用到该方法的输出。一旦您看到它在运行并快速了解compareTo方法的工作原理,这就非常有意义了,但是当您在官方文档中快速描述compareTo方法时,这可能就不那么明显了,即使描述很清楚,并且您能够弄清楚compareTo方法在给定条件下将输出什么BigDecimal值调用该方法,并将给定的BigDecimal输入作为比较值。对于广泛使用compareTo方法与BigDecimal以外的其他类进行比较的任何人来说,这可能是显而易见的,即使它们是特定类的新手,但如果您最近没有对任何compareTo方法的结果使用布尔值,则速度更快去看看吧

使用ints时,您可能会编写如下代码:

int x = 5;
x = x + 2;
System.out.println(x) // should be 7
在这里,“2”值从未被声明为int。加法的结果与我们声明y=2并表示x=x+y而不是x=x+2时的结果相同,但在上面的代码行中,没有命名变量,或者整数对象(如果我们使用它们而不是基元int),是为“2”创建的.另一方面,对于BigDecimal,由于BigDecimal.add方法需要输入BigDecimals,因此必须创建一个等于2的BigDecimal才能添加2。我在官方文档中没有看到任何这样的内容“如果您想要比BigInteger更通用的东西,可以将其用作Double或Long更精确的替代品,但除了将其用作声明变量的替代品外,还可以创建等于小整数的BigDecimal对象,这些小整数本身不需要使用BigDecimal类,以便您可以在opera中使用它们选项。如果要使用大小数,则变量和添加到变量中的小值都必须是大小数。”

最后,让我解释一些可能会使BigDecimal类变得比它需要的更可怕的东西。任何曾经使用过基元数组并试图在创建数组时提前预测它需要多大,或者熟悉级别有多低的数组的人
int x = 5;
x = x + 2;
System.out.println(x) // should be 7