在除法后获取数字中的所有小数位

时间:2013-03-01 18:41:03

标签: java formatting bigdecimal

我目前正在使用BigDecimal,它给了我更多小数但不足以满足我的目的。我需要能够一直到10 ^ 6数字。这是我目前的代码

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

并输出 3.14159265301190249175533608649857342243194580078125

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

问题在于你如何编号。在103993/33102.0类涉及之前,double被评估为双精度浮点表达式(BigDecimal)。您应该创建单独的BigDecimal个对象,并使用BigDecimal.divide来获取所需的数字。

由于您需要精确的结果,我可能会在启动时将两个数字作为整数传递。

即使这样做,我怀疑你能够走出10 ^ 6数字。您可能需要实现自己的除法算法才能达到该级别,因为任意精确数学的任何理智实现都会在该点之前停止很长时间(至少默认情况下)。