2

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

我的总结目前是键入的double

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

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

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

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

我知道double's 是 64 位类型,因此不会超过 16 位小数。我也理解使用long作为类型会失去精度......

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

谢谢你。

更新

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

再次更新

我刚刚意识到我认为我的问题出scale在我的分裂期间。我将其更改为 100,现在将 Pi 设置为小数点后 100 位...我认为该scale参数允许更高的精度等。它需要该divide(BigDecimal divisor, int scale, int roundingMode)方法。请参阅 Java 文档>> 这里 <<

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

感谢大家的帮助。

4

3 回答 3

5

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

查看 BigDecimal 的 Javadoc ( http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html ) 使用标准类型和这种 BigDecimal 类型之间的主要区别在于,您不能使用 +、- 等运算符,但需要使用 add()、divide() 等方法。

于 2013-08-08T19:11:22.507 回答
4

首先,双精度数的宽度与它可以容纳的小数位数没有直接关系。双精度值是尾数和指数(除其他外),当然,在内部以 2 为底,因此它比“双精度可以保存 X 位小数”更复杂。

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

于 2013-08-08T19:09:21.217 回答
1

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

于 2013-08-08T19:08:40.887 回答