我写了一个小程序来计算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的目的,这很好。
谢谢大家的帮助。
答案 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对象。