【问题标题】:Calculating an Answer in Java with more than 16 decimal places用 Java 计算超过 16 位小数的答案
【发布时间】:2024-01-02 01:23:02
【问题描述】:

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

我的总结目前输入double

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

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

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

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

我了解double 是 64 位类型,因此不会超过 16 位小数。 我也明白使用long 作为类型会失去精度......

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

谢谢。

更新

不幸的是,我仍然没有使用 BigDecimals 得到超过 16 位小数... 我的方向正确吗?

再次更新

我刚刚意识到我认为我的问题出在我部门期间的 scale 上。我将它更改为 100,现在我将 Pi 设置为 100 个小数位......我认为 scale 参数允许更高的精度等。它需要 divide(BigDecimal divisor, int scale, int roundingMode) 方法。参见 Java 文档>> here <<

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

感谢大家的帮助。

【问题讨论】:

  • BigDecimal 可以很好地进行计算。
  • 您正在寻找一个支持“任意精度算术”的库。 BigDecimal 执行此操作并包含在 Java 中。
  • 我已经更新了我的问题并添加了代码...不幸的是,我遇到了异常,我不明白为什么...谢谢。

标签: java decimal pi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,我知道double 的情况比这更复杂,我只是明确表示我知道它可以提供的最大值不足以满足我的要求。谢谢你的评论。我更新了我的问题并添加了代码(尝试使用 BigDecimal)。
    【解决方案3】:

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

    【讨论】: