有没有办法从BigDecimal获得第n个数字?
使用本文 - > generating pi to nth digit java
我在BigDecimal中使用Euler公式设置了pi的值。现在我希望能够调用它的特定数字。
int getPiDigit(3) = 4 // 3.14
我想也许会有一种方法可以让BigDecimal以某种方式将它的值存储在数组中。我最初尝试将值作为String获取,但是当它转换为字符串时,它只需要大约47个字符。对我来说,我至少需要去512.
以下是一些示例代码,用于显示我正在做的事情......
MathContext mc = new MathContext(1000);
BigDecimal pi = new BigDecimal(20*Math.atan(1.0/7) + 8*Math.atan(3.0/79) ,mc); //Should give pi up to 1000 digits
System.out.println(pi.toString().charAt(50));
//Throws Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 50
答案 0 :(得分:0)
最简单的方法是将BigDecimal
转换为String
,您只需使用String#charAt(int)
我不确定为什么你不能抓住47个字符。 String转换应将所有数字转换为您在BigDecimal中定义的比例。问题很可能是由于你的Pi计算逻辑错误地使用BigDecimal引起的。
您的假设似乎无效:使用BigDecimal(double, MathContext)
传入MathContext并不一定会使结果包含MathContext声明的有效数字。引自Javadoc:
将double转换为BigDecimal,并根据上下文设置进行舍入。 BigDecimal的比例是最小值,使得(10 ^ scale×val)是整数。
你做的方式也是不合理的:对于double
,它只对15个有效数字准确。从你的双倍计算结果中取出1000个重要数字并不意味着什么。
答案 1 :(得分:0)
在调用toString()之前,需要调用setScale()来设置所需的小数位数,如下所示:
pi.setScale(n, BigDecimal.ROUND_DOWN);
' N'是小数位数。你想要向下舍入,以便第n个小数位从不向上舍入。
答案 2 :(得分:0)
您将 pi 计算为double,然后将其转换为BigDecimal。这不会比双重神奇地增加更多的精确度,根据定义,它不会超过53位。
你需要在BigDecimal中计算pi 。