Double to BigDecimal,比较两者

Mus*_*ons 2 java double bigdecimal

我必须做一个双重比较,我已经尝试了很多东西,但没有什么真正起作用..他们负责停止循环.首先,使用(双)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);  
Run Code Online (Sandbox Code Playgroud)

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

我想比较双打,精度至少为1*10 ^ -7.

提前致谢!

Jon*_*oni 6

鉴于浮点数具有较大的范围,为了比较两个浮点数彼此的接近程度,通常会使用 相对差异.

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

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

更新:此实现有一些问题:

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

更好的实现首先检查x和y是否接近零,并除以最大值或最小值.您可以在Bruce Dawson的比较浮点数中阅读有关此问题的更多信息.