2

我必须进行双重比较,我尝试了很多东西,但没有任何效果..他们负责停止循环。首先,使用 (double) Math.round(x*10000000)/10000000 比较 double 的他们自己,工作得很好,但后来.. 数字是相同的,但不是(反之亦然),所以循环无休止地继续。尝试将它们四舍五入并比较长值,仍然相同。最后,尝试使用 Big-decimal,再次遇到问题。

BigDecimal value=new BigDecimal(Double.toString(decimalNumber),MathContext.DECIMAL32);  

BigDecimal temp=new BigDecimal(Double.toString((1/count)*sum),MathContext.DECIMAL32);  

这段代码有什么问题?据我所知,最好使用字符串构造函数,所以我正在使用它。第二行返回一个多汁的“java.lang.NumberFormatException”,如果我将第二行编辑为例如 5.3222,一段时间后,第一行返回相同的错误。我应该用 BigDecimals 替换双精度数,仅用于此比较吗?这对我来说似乎很愚蠢,必须有一种简单的方法来进行这种比较。

我正在尝试比较双打,精度至少为 1*10^-7。

提前致谢!

4

2 回答 2

6

鉴于浮点数的范围很大,要比较两个浮点数彼此之间的接近程度,您通常会使用 相对差异

x和之间的相对差异yMath.abs((x-y)/x)。如果相对差异低于某个阈值,您可以认为 x 和 y 相等,例如:

if (Math.abs((x-y)/x) < 1e-9) {
    // x is nearly equal to y
}

更新:这个实现虽然有一些问题:

  • 它不是对称的:如果 x = y,我们也期望 y = x。
  • 如果 x 或 y 为零,它们的比较总是不相等,因为相对差异为 1 或无穷大。
  • 如果 x 和 y 都为零,则它们比较为不相等,因为左侧计算的是 0/0 (NaN)

更好的实现首先检查 x 和 y 是否接近零,然后除以最大或最小。您可以在 Bruce Dawson 的Comparing floating point numbers中阅读有关此问题的更多信息。

于 2013-04-03T17:07:14.897 回答
1

如果 A 是 Double 而 B 是 BigDecimal,为什么不暂时将 A 提升为 BigDecimal 进行比较?

于 2013-09-17T17:29:51.757 回答