用Java计算小数超过16位的答案

我写了一个小程序来计算Java中的Pi。

我的总结目前是double

我有两个输出,一个是Pi到16位小数(原始输出)。 第二个输出使用NumberFormat / DecimalFormat舍入到3-5个小数位。

我花了一段时间谷歌搜索和浏览Stackoverflow但作为一个初学者我不确定任何可能需要的keywords ,以找到我正在寻找的正确方法,所以请原谅我的天真…

是否可以将答案(即Pi)计算到16位小数以上? 说,32? 如果是这样,我该如何处理?

我看过BigDecimal ,但是我不认为这是我所追求的,因为我看过的所有例子都是先用大量的小数位预先定义数字,而不是通过计算,但我可能是错误。

我知道double的是64位类型,所以不会超过16位小数。 我也明白使用long因为类型会丢失精度…

任何建议或指导将不胜感激。

谢谢。

更新

不幸的是,我仍然没有使用BigDecimals获得超过16位小数…我是朝着正确的方向前进吗?

再次更新

我刚刚意识到我认为我的问题在于我的分工期间的scale 。 我将它改为100,现在我得到Pi到100位小数……我认为scale参数允许更高的精度等。它需要divide(BigDecimal divisor, int scale, int roundingMode)方法。 请参阅Java Doc >> here <<

有了Madhava-Leibniz系列的500,000个术语,我现在可以用6’正确’有效数字计算Pi到10,000个小数位。 其余的仍在收敛(显然需要1000多个术语才能更准确地表示Pi)。 但是为了我们大多数人需要Pi的目的,这很好。

感谢大家的帮助。

首先,double的宽度与它可以容纳的小数位数没有直接关系。 double值是尾数和指数(以及其他),当然,内部是base 2,因此它比“double可以容纳X小数位”更复杂。

在任何情况下,您都应该能够使用BigDecimal进行所有计算,只需使用BigDecimal方法而不是内置算术运算符来执行所有数学运算。

使用BigDecimal是解决此问题的好方法。 没有其他标准类型无法为您处理此精度。 其他方法是实现自己的数据结构。 但我敢打赌,BigDecimal会好得多。

看一下Javadoc for BigDecimal( http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html )使用标准类型和这个BigDecimal类型的主要区别,就是你不能使用+, – 等运算符,但你需要使用add(),divide()等方法。

BigDecimal就是你想要的。 它有像add(),multiply()pow()等方法返回新的BigDecimal对象。