java - 加倍到 BigDecimal,比较两者

标签 java double bigdecimal

我必须进行双重比较,我尝试了很多方法,但没有任何效果。它们负责停止循环。 首先,使用 (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 彼此的接近程度,您通常会使用相对差

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 中阅读有关此问题的更多信息.

关于java - 加倍到 BigDecimal,比较两者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15793446/

相关文章:

java - 如何将 C++ double 从一个系统发送到另一个发件人 : Winsock Receiver: Java

java - 将货币值存储为 Doubles 但使用 BigDecimal 计算值

java - System.in.read() 不读取

java - 来自java大脑的Struts 2简单应用

java - 使用 Jackson 忽略某些字段反序列化而不更改模型

java.lang.NoSuchMethodError : org. apache.commons.lang.StringUtils.isBlank(Ljava/lang/String;)Z错误

c++ - 双变量之和

c# - string.format(format,doubleValue) ,精度丢失

java - 使用 Double 做财务软件

java - BigDecimal 的未缩放值是多少?