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

时间:2013-08-08 19:06:25

标签: java decimal pi

我写了一个小程序来计算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个术语,我现在可以计算Pi到10,000个小数位,其中有6个“正确”有效数字。其余的仍在收敛(显然需要1000多个术语才能更准确地表示Pi)。但是出于我们大多数人需要Pi的目的,这很好。

谢谢大家的帮助。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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