在进行除法运算后,获取数字中的所有小数位数

14 浏览
0 Comments

在进行除法运算后,获取数字中的所有小数位数

我目前正在使用BigDecimal,它提供了更多的小数位数,但对于我的需求还远远不够。我需要能够获取到10^6位数字。这是我的当前代码:

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

输出结果为3.14159265301190249175533608649857342243194580078125,实际上该数字有更多的小数位数:http://www.wolframalpha.com/input/?i=103993%2F33102

0
0 Comments

问题是你生成数字的方式不正确。在BigDecimal类介入之前,103993/33102.0被解释为一个双精度浮点表达式(double)。你应该创建独立的BigDecimal对象,并使用BigDecimal.divide来得到你想要的数字。

由于你想要精确的结果,我建议在开始时将两个数字都传入为整数。

即使这样做,我怀疑你也无法得到10^6位数的结果。如果你想要达到那个级别,可能需要实现自己的除法算法,因为任何明智的任意精度数学实现都会在那个点之前停止(至少默认情况下)。

我相当确定BigDecimal拥有你想要的任意精度(如果你想要更多精度,你可以在divide中适当地指定scale参数)。

0
0 Comments

当进行double类型的除法运算时,会丢失精度。使用BigDecimal类可以解决这个问题。以下是解决方法:

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.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737

在Eclipse控制台中,输出结果为`3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613`。这可能是因为Eclipse不打印整个结果。如果需要获取更多位数的结果,可以将`scale`设置更大,但是计算时间会变长。

在Eclipse中,最大的`scale`值为4095。如果将其设置为4096,结果为`3.`。

如果想要更快地获取10000位数的结果,可以考虑使用其他算法或者使用`BigDecimal`类。

0