用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对象。