Double to BigDecimal,比较两者

时间:2013-04-03 16:54:00

标签: 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);  

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

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

提前致谢!

2 个答案:

答案 0 :(得分:6)

鉴于浮动数字的范围很大,为了比较两个浮点数彼此的接近程度,通常会使用相对差值

xy之间的相对差异为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中了解有关此问题的更多信息。

答案 1 :(得分:1)

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