我必须进行双重比较,我尝试了很多方法,但没有任何效果。它们负责停止循环。 首先,使用 (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 替换 double 吗,只是为了这个比较?这对我来说似乎很愚蠢,必须有一种简单的方法来进行这种比较。
我正在尝试比较 double ,精度至少为 1*10^-7。
提前致谢!
最佳答案
鉴于 float 的范围很大,要比较两个 float 彼此的接近程度,您通常会使用相对差。
x
和y
之间的相对差异是Math.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 中阅读有关此问题的更多信息.
关于java - 加倍到 BigDecimal,比较两者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15793446/