7

我目前正在使用 BigDecimal,它给了我更多的小数,但对于我想要做的事情来说还远远不够。我需要能够一直到达 10^6 位。这是我当前的代码

BigDecimal num = new BigDecimal(103993/33102.0);
    pw.println(num.toString());

它输出3.14159265301190249175533608649857342243194580078125

这个数字实际上有更多的小数:http ://www.wolframalpha.com/input/?i=103993%2F33102

4

2 回答 2

17

评估时,您会失去精度:

103993/33102.0

作为双师。实际上,如下:

BigDecimal num = new BigDecimal(103993/33102.0);

相当于:

double d = 103993/33102.0;
BigDecimal num = new BigDecimal(d);

相反,使用:

int scale = 100;
BigDecimal num1 = new BigDecimal(103993);
BigDecimal num2 = new BigDecimal(33102);
System.out.println(num1.divide(num2, scale, RoundingMode.HALF_UP).toString());

输出:

3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737
于 2013-03-01T18:50:16.853 回答
3

问题是你如何制作你的号码。在类参与之前,它103993/33102.0被评估为双精度浮点表达式 ( double) 。BigDecimal您应该制作单独的BigDecimal对象并使用BigDecimal.divide来获得您想要的数字。

由于您想要准确的结果,因此我可能会在开始时将您的两个数字都作为整数传递。

即使这样做了,我怀疑你能否达到 10^6 位。您可能需要实现自己的除法算法才能达到该级别,因为任意精度数学的任何合理实现都将在该点之前很久停止(至少默认情况下)。

于 2013-03-01T18:47:10.527 回答