我必须做一个双重比较,我尝试了很多东西,但没有什么真正起作用..他们负责停止循环。 首先,使用(双)Math.round(x * 10000000)/ 10000000对自己进行双倍比较,工作正常然后..数字是相同的,但不是(反之亦然),所以循环持续不断。 尝试四舍五入并比较长值,仍然相同。 最后,尝试使用大小数,再次遇到问题。
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。
提前致谢!
答案 0 :(得分:6)
鉴于浮动数字的范围很大,为了比较两个浮点数彼此的接近程度,通常会使用相对差值。
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是否接近零,并除以最大值或最小值。您可以在Bruce Dawson的Comparing floating point numbers中了解有关此问题的更多信息。
答案 1 :(得分:1)
如果A是Double而B是BigDecimal,为什么不暂时将A推广到BigDecimal进行比较?