是否有适用于BigDecimal的平方根库?

30

Java中是否有用于BigDecimal平方根的库?


13
任何使用BigDecimal的原因都相同:double缺乏精度。 - Daniel C. Sobral
7
不,Double和BigDecimal本质上是不同的。Double的“精度”取决于你要表示的数字。有些数字在任何精度下都无法准确表示。而使用BigDecimal可以任意设置精度,在该精度范围内,可以表示任何小数。 - Daniel C. Sobral
1
像1/3这样的数字在十进制中无法精确表示,除非使用无限数量的数字。更重要的是,像sqrt(2)这样的数字在任何基础上都无法表示,除非使用无限数量的数字。这是一个数学事实。至于平方根的计算,使用牛顿法会导致另一种不准确性。使用牛顿法,如何知道您计算出的平方根的前N位数字是正确的?有方法可以解决这个问题,但牛顿法不是其中之一:http://en.wikipedia.org/wiki/Methods_of_computing_square_roots - quant_dev
丹尼尔,你忽略了问题的背景:计算平方根。想想牛顿法如何计算平方根,以及是否具有任意精度可以帮助你以任意精度找到结果。 - quant_dev
5
禁止劫持。我需要它的原因和任何人使用BigDecimal一样:Double缺乏精度。 BigDecimal可以给我请求的精度,而Double不能。然后,你提出了对牛顿迭代法的批评,这与问题无关。我反驳了剩下的陈述,你又提到了牛顿迭代法。好吧,在涉及牛顿迭代法的回答下批评它,不要改变问题本身-或者带来新的与问题相关的东西。 - Daniel C. Sobral
显示剩余7条评论
3个回答

14

JScience v4.3.1有一个Real类,它似乎是BigDecimal的等价物,可能会对您有所帮助。以下是用法示例:

// The Square Root of Two, to 30 digits
// According to "The Square Root of Two, to 5 million digits."
// Source: http://www.gutenberg.org/files/129/129.txt
System.out.println("1.41421356237309504880168872420");

// Using JScience with 50 digits precision
Real.setExactPrecision(50);
System.out.println(Real.valueOf(2).sqrt());

// Using default java implementation
System.out.println(Math.sqrt(2));

> 1.41421356237309504880168872420
> 1.414213562373095048801689
> 1.4142135623730951

编辑:根据@ile和@Tomasz的建议,已更新代码和链接以反映当前版本(v4.3.1)。


我下载了JScience包,似乎不再有Decimal了。上面的链接已经失效了。 - ılǝ
它有一个LargeInteger类,似乎相当于http://jscience.org/api/org/jscience/mathematics/number/LargeInteger.html - Master_ex
十进制已被Real取代 http://jscience.org/api/org/jscience/mathematics/number/Real.html - Tomasz
如果这些数字不是int或double而是BigDecimal,我们该怎么办? - codebusta

12

链接已经失效。但是我可以获取一个看起来相同的代码:https://ritdml.rit.edu/bitstream/handle/1850/8800/BigSquareRoot.java?sequence=4 - demongolem
demongolem评论中的链接也已经失效。 - Joshua Dawson

1

(这可能不是您的解决方案)

只要您的BigDecimal在double范围内,您可以将BigDecimal转换为double,使用Math.sqrt()并将double提升回BigDecimal。与在BigDecimals上进行计算相比,这可能会更快。在许多情况下,由于类型之间的转换而导致的精度损失将与计算平方根时不可避免的误差相比微不足道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接