获取BigDecimal的第n位数

时间:2014-04-15 01:28:40

标签: java bigdecimal pi

有没有办法从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

3 个答案:

答案 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