java比较double_如何在Java中比较两个double值?

如何在Java中比较两个double值?

Java中两个double值的简单比较会产生一些问题。 让我们考虑以下Java中的简单代码段。

package doublecomparision;

final public class DoubleComparision

{

public static void main(String[] args)

{

double a = 1.000001;

double b = 0.000001;

System.out.println("\n"+((a-b)==1.0));

}

}

上面的代码似乎返回true,表达式((a-b)==1.0)的求值,但没有。 而是返回false,因为此表达式的计算值为0.9999999999999999,实际上预期为1.0,该值不等于1.0,因此条件的计算结果为布尔值false。克服这种情况的最佳方法是什么?

Lion asked 2020-02-10T17:00:00Z

7个解决方案

84 votes

基本上,您不应该进行精确比较,而应该执行以下操作:

double a = 1.000001;

double b = 0.000001;

double c = a-b;

if (Math.abs(c-1.0) <= 0.000001) {...}

Kevin answered 2020-02-10T17:00:20Z

11 votes

请勿将java.math.BigDecimal用作双精度十进制算术。 它将产生预期的结果。

作为参考,请看一下这个stackoverflow问题

Zaki Saadeh answered 2020-02-10T17:00:44Z

5 votes

您可以使用Double.compare; 它比较两个指定的double值。

Anand answered 2020-02-10T17:01:05Z

0 votes

int mid = 10;

for (double j = 2 * mid; j >= 0; j = j - 0.1) {

if (j == mid) {

System.out.println("Never happens"); // is NOT printed

}

if (Double.compare(j, mid) == 0) {

System.out.println("No way!"); // is NOT printed

}

if (Math.abs(j - mid) < 1e-6) {

System.out.println("Ha!"); // printed

}

}

System.out.println("Gotcha!");

Splash answered 2020-02-10T17:01:20Z

-1 votes

double a = 1.000001;

double b = 0.000001;

System.out.println( a.compareTo(b) );

返回值:

-1:“ a”在数值上小于“ b”。

0:“ a”等于“ b”。

1:“ a”大于“ b”。

Ibrahim answered 2020-02-10T17:01:53Z

-1 votes

考虑以下代码行:

Math.abs(firstDouble - secondDouble) < Double.MIN_NORMAL

它返回firstDouble是否等于secondDouble。 我不确定这是否适合您的具体情况(正如凯文指出的那样,对浮点数执行任何数学运算都会导致结果不精确),但是我很难比较两个相等的双精度数, 但是使用'compareTo'方法并没有返回0。

我只是把它留在那里,以防有人需要比较以检查它们是否确实相等,而不仅仅是相似。

ThePC007 answered 2020-02-10T17:02:25Z

-4 votes

只需使用Double.compare()方法比较双精度值即可。

Double.compare((d1,d2)== 0)

double d1 = 0.0;

double d2 = 0.0;

System.out.println(Double.compare((d1,d2) == 0)) // true

Chanaka Fernando answered 2020-02-10T17:02:49Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值