double类型数据比较


Double d1=100.0;
Double d2=100.0;
为什么d1==d2的结果是false

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

在Java中,使用==比较两个Double对象时,会比较它们的引用而不是值。因此,尽管d1d2的值相等,但由于它们是两个不同的对象,所以d1==d2的结果为false

这是因为Double是一个包装类(Wrapper Class),它是对基本数据类型double的封装,具有对象的特性。在Java中,对于包装类对象的比较,应使用.equals()方法而不是==运算符来比较它们的值。

以下是一个示例,演示了使用.equals()方法来比较两个Double对象的值:

Double d1 = 100.0;
Double d2 = 100.0;

boolean result = d1.equals(d2);  // 使用equals()方法进行值的比较

System.out.println(result);  // 输出:true

通过使用.equals()方法,您可以比较Double对象的值而不是引用,从而得到预期的结果。

对象之间的比较要用equals:d1.equals(d2)
== 比较的是对象的指针地址。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7581026
  • 这篇博客也不错, 你可以看下double类型数据的加减乘除
  • 除此之外, 这篇博客: double比较中的 样例输入 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    99
    101
    9999
    
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string.h>
    #include <string>
    #include <stdio.h>
    #include <stdlib.h>
    #include <cmath>
    using namespace std;
    string x, y;
    int a[100005], b[100005], c[100005], la, lb, lc;
    int main() {
    	cin >> x >> y;
    	la = x.length();
    	lb = y.length();
    	for (int i = 0; i < la; i++) {
    		a[la - i] = x[i] - '0';
    	}
    	for (int i = 0; i < lb; i++) {
    		b[lb - i] = y[i] - '0';
    	}
    	for (int i = 1; i <= la; i++) {
    		for (int j = 1; j <= lb; j++) {
    			c[i + j - 1] += a[i] * b[j];
    			c[i + j] += c[i + j - 1] / 10;
    			c[i + j - 1] %= 10;
    		}
    	}
    	lc = la + lb;
    	while (c[lc] == 0 )lc--;
    	for (int i = lc; i >= 1; i--)
    		cout << c[i];
    	return 0;
    }
    
    
    

    看下面的算式:
    □□ x □□ = □□ x □□□
    它表示:两个两位数相乘等于一个两位数乘以一个三位数。
    如果没有限定条件,这样的例子很多。
    但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
    该算式中1至9的每个数字出现且只出现一次!
    比如:
    46 x 79 = 23 x 158
    54 x 69 = 27 x 138
    54 x 93 = 27 x 186
    .....
    请编程,输出所有可能的情况!
    注意:左边的两个乘数交换算同一方案,不要重复输出!

    (乘号用英文字母x代替,符号与数字之间有一个空格)

    
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string.h>
    #include <string>
    #include <stdio.h>
    #include <stdlib.h>
    #include <cmath>
    using namespace std;
    
    int main()
    {
    	int a[9] = { 1,2,3,4,5,6,7,8,9 };
    	do {
    		int t1, t2, t3, t4;
    		t1 = a[0] * 10 + a[1];
    		t2 = a[2] * 10 + a[3];
    		t3 = a[4] * 10 + a[5];
    		t4 = a[6] * 100 + a[7] * 10 + a[8];
    		if (t1 < t2 && t1 * t2 == t3 * t4) {
    			cout << t1 << " x " << t2 << " = " << t3 << " x " << t4 << endl;
    		}
    	} while (next_permutation(a, a + 9));
    	return 0;
    }
    
    
    
    

    C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛。两个小岛间可能存在多座桥连接。然而,由于海水冲刷,有一些大桥面临着不能使用的危险。

      如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了。然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事。但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起抗议。

      现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了。现在他想知道居民们会有多少天进行抗议。

    样例说明

      第一天后2和3之间的桥不能使用,不影响。
      第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。
      第三天后3和4之间的桥不能使用,居民们会抗议。

    数据规模和约定

      对于30%的数据,1<=n<=20,1<=m<=100;
      对于50%的数据,1<=n<=500,1<=m<=10000;
      对于100%的数据,1<=n<=10000,1<=m<=100000,1<=a, b<=n, 1<=t<=100000。

     输入的第一行包含两个整数n, m,分别表示小岛的个数和桥的数量。
      接下来m行,每行三个整数a, b, t,分别表示该座桥连接a号和b号两个小岛,能使用t天。小岛的编号从1开始递增。

      输出一个整数,表示居民们会抗议的天数。

    4 4
    1 2 2
    1 3 2
    2 3 1
    3 4 3
    2

    
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string.h>
    #include <string>
    #include <stdio.h>
    #include <stdlib.h>
    #include <cmath>
    using namespace std;
    
    struct node
    {
        int x, y, d;
    } s[100000 + 5];
    int n, fa[10000 + 5];
    
    bool cmp(node a, node b)
    {
        return a.d > b.d;
    }
    
    void Set()
    {
        for (int i = 1; i <= n; i++)
            fa[i] = i;
    }
    int find(int x) {
        if (fa[x] == x)
            return x;
        int root = x;//返回的祖先节点
        while (fa[root] != root)root = fa[root];//不断回溯
        int tmp = x;//临时存储x
        //路径压缩
        while (fa[x] != x) {
            tmp = fa[x];//存储上一个节点fa[x]
            fa[x] = root;//将本节点x指向根节点
            x = tmp;//更新x
        }
        return root;
    }
    
    bool Union(int x, int y)
    {
        x = find(x);
        y = find(y);
        if (x != y)
        {
            fa[x] = y;
            return 1;
        }
        return 0;
    }
    
    
    int main()
    {
        int m;
        while (~scanf("%d%d", &n, &m))
        {
            for (int i = 1; i <= m; i++)
            {
                scanf("%d%d%d", &s[i].x, &s[i].y, &s[i].d);
            }
            sort(s + 1, s + m + 1, cmp);
            Set();
            int pre = -1, ans = 0;//表示前一次是在第几天进行反抗的
            for (int i = 1; i <= m; i++)
            {
                int way = Union(s[i].x, s[i].y);//way=0表示之前有桥,不需要在建桥
                if (way == 1 && s[i].d != pre)
                {
                    ans++;
                    pre = s[i].d;
                }
            }
            cout << ans << endl;
        }
        return 0;
    }
    
    

    给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。

    输入的第一行为一个整数n,表示棋盘的大小。
      接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

    输出一个整数,表示总共有多少种放法。

    4
    1 1 1 1
    1 1 1 1
    1 1 1 1
    1 1 1 1
  • 以下回答来自chatgpt:

    有两种方法可以比较两个double类型的数据:

    方法一:使用Math.abs函数对两个数据进行差值计算,然后与一个足够小的值进行比较,如果差值小于该值,则认为两个数据相等。

    public boolean isEqual(double a, double b) {
        double epsilon = 1E-8;  // 可以根据需求调整epsilon的值
        return Math.abs(a - b) < epsilon;
    }
    

    方法二:将两个double类型的数据转换成字符串,然后通过字符串比较的方式来比较它们是否相等。

    public boolean isEqual(double a, double b) {
        return Double.toString(a).equals(Double.toString(b));
    }
    

    需要注意的是,由于浮点数存在精度丢失问题,因此在进行比较时可能会出现误差。为了减少误差,可以采用方法一中的方法调整epsilon的值,或者使用专门针对浮点数比较的第三方库(例如Apache Commons Math库中的Precision类)。另外,建议在使用浮点数进行计算时尽量避免出现精度问题,可以采用BigDecimal类代替浮点数计算。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^