在进行除法运算后,获取数字中的所有小数位数
在进行除法运算后,获取数字中的所有小数位数
我目前正在使用BigDecimal,它提供了更多的小数位数,但对于我的需求还远远不够。我需要能够获取到10^6位数字。这是我的当前代码:
BigDecimal num = new BigDecimal(103993/33102.0); pw.println(num.toString());
输出结果为3.14159265301190249175533608649857342243194580078125,实际上该数字有更多的小数位数:http://www.wolframalpha.com/input/?i=103993%2F33102。
问题是你生成数字的方式不正确。在BigDecimal
类介入之前,103993/33102.0
被解释为一个双精度浮点表达式(double
)。你应该创建独立的BigDecimal
对象,并使用BigDecimal.divide
来得到你想要的数字。
由于你想要精确的结果,我建议在开始时将两个数字都传入为整数。
即使这样做,我怀疑你也无法得到10^6位数的结果。如果你想要达到那个级别,可能需要实现自己的除法算法,因为任何明智的任意精度数学实现都会在那个点之前停止(至少默认情况下)。
我相当确定BigDecimal
拥有你想要的任意精度(如果你想要更多精度,你可以在divide
中适当地指定scale
参数)。
当进行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`类。