精华内容
下载资源
问答
  • double判断相等
    2021-09-16 17:28:55

    起因

    在c++开发中,double或者float类型判断相等性不能简单的用等于符号进行,一般会采用如下方式进行判断

    static inline bool DoubleEqual(double a, double b)
    {
         return fabs(a - b) < std::numeric_limits<double>::epsilon();
    }

    为了验证这个说法,我在机器上写了如下一段代码, 结果竟然没有一次输出,貌似可以直接比较

    double a = 0, b = 0;
    for(int i = 0; i < 100000; i++) {
        a += i * 0.1;
        b += i * 0.1;
        if ( a != b) {
            printf("%f %f\n", a ,b);
        }
    }
    

    那么到底浮点数能不能比较?

    #include<stdio.h>
    int main()
    {
    	float x = 0.1;
    	if (x == 0.1)
    		printf("IF");
    	else if (x == 0.1f)
    		printf("ELSE IF");
    	else
    		printf("ELSE");
    }
    

    这段代码输出ELSE IF,这也就意味着 x == 0.1 返回了false。 x==0.1f 返回了true。这又是为什么呢?先看一段代码

    #include<stdio.h>
    int main()
    {
    float x = 0.1;
    printf("%d %d %d", sizeof(x), sizeof(0.1), sizeof(0.1f));
    return 0;
    }
    

    这段代码输出 4 8 4, 这也就说明代码中不加上f后缀,默认会采用double类型。前面的例子中 x == 0.1 导致了x 变量提升到double,double 位数比float要多,这时候就需要二进制补全。0.1的二进制表示为(0.00011001100110011…) 后面的...表示循环数。由于float的位数(23)要小于double(52)的位数,在x变量提升到double后, 编译器会将多余的尾补全尾0。

    0.00011001100110011001100 float 0.1
    | 变量提升
    V
    0.00011001100110011001100000000000000000 (float 0.1 提升到double 0.1的二进制表示)
    
    0.0001100110011001100110011001100110011001100110011001(原double 0.1的二进制表示)

    上述结果就得到了解释,float提升到double后的二进制表示和double 0.1的二进制完全不一样。

    难道所有的比较都会有这个问题吗?并不是。下面有个例子就不会产生问题比如

    #include<stdio.h>
    int main()
    {
    	float x = 0.5;
    	if (x == 0.5)
    		printf("IF");
    	else if (x == 0.5f)
    		printf("ELSE IF");
    	else
    		printf("ELSE");
    }
    

    这个就输出了IF, 

    0.5的二进制表示为0.100000…, 由此看见就算编译器在尾补上补充再多的0,也不会导致二进制表示不一样。

    总结

    同类型的比较不设计到变量提升或者截断,可以直接比较。当变量提升或者截断后,二进制没有循环模式的也是可以直接比较的。

    更多相关内容
  • Double判断是否相等

    千次阅读 2020-06-19 11:26:14
    注意::java中的Double类型是不能用双等于判断是否相等的(==),即使俩个Double值的精度都是一样的用(==)双等于他们俩也是不相等的,或者比大小也不能直接使用大于小于号的(< >) 直接使用sun提供的Double....

    注意::java中的Double类型是不能用双等于判断是否相等的(==),即使俩个Double值的精度都是一样的用(==)双等于他们俩也是不相等的,或者比大小也不能直接使用大于小于号的(<       >)

    直接使用sun提供的Double.doubleToLongBits()方法来判断

    判断是否相等:Double.doubleToLongBits(你的Double值) == Double.doubleToLongBits(你的Double值)

     判断是否大于:Double.doubleToLongBits(你的Double值) > Double.doubleToLongBits(你的Double值)

     判断是否小于:Double.doubleToLongBits(你的Double值) < Double.doubleToLongBits(你的Double值)

     

     

    展开全文
  • 在Java中int类型数据的大小比较可以使用双等号,double类型则不能使用双等号来比较大小。第一种方法:转换成字符串,第二种方法:使用SUN提供的DOUBLE.DOUBLETOLONGBITS()方法,方法3:比较大小

    在Java中int类型数据的大小比较可以使用双等号double类型不能使用双等号来比较大小,如果使用的话得到的结果将永远是不相等,即使两者的精度是相同的也不可以。下面介绍两种比较double数据是否相等的方法。

    第一种方法:转换成字符串

            如果要比较的两个double数据的字符串精度相等,可以将数据转换成string然后借助string的equals方法来间接实现比较两个double数据是否相等。

    注意:这种方法只适用于比较精度相同的数据,并且是只用用于比较是否相等的情况下,不能用来判断大小。

    Float.toString(453.2348f).equals(Float.toString(0.342f))
     
    Double.toString(0.8456d).equals(Float.toString(0.242f))

     

    第二种方法:使用SUN提供的DOUBLE.DOUBLETOLONGBITS()方法

    该方法可以将double转换成long型数据,从而可以使double按照long的方法(<, >, ==)判断是否大小和是否相等。

    Double.doubleToLongBits(0.01) == Double.doubleToLongBits(0.01) 
    Double.doubleToLongBits(0.02) > Double.doubleToLongBits(0.01) 
    Double.doubleToLongBits(0.02) < Double.doubleToLongBits(0.01)

    第三种方法:

    对于double类型,比如double d1=0.0000001,double d2=0d 当判断两个数据d1和d2是否相等的时候,一般不直接使用

    if(d1==d2)

    第四种办法

    double a = 0.001; 
    double b = 0.0011; 
    BigDecimal data1 = new BigDecimal(a); 
    BigDecimal data2 = new BigDecimal(b); 
    data1.compareTo(data2) 
    非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型!

     

    -------------------------------------以下无正文-----------------------------------------------------------

    注:仅供学习,记录问题和参考,共勉!

    展开全文
  • 依然要使用到精度。 #include <...const double EPISON = 1e-6; int main() { double a, b; cin >> a >> b; if (fabs(a - b) < EPISON) { cout << "a is equal to b" << e

    依然要使用到精度。

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    const double EPISON = 1e-6;
    
    int main() {
        double a, b;
        cin >> a >> b;
        if (fabs(a - b) < EPISON) {
            cout << "a is equal to b" << endl;
        } else {
            cout << "a is not equal to b" << endl;
        }
    
        return 0;
    }
    
    展开全文
  • C++判断两个double相等不能用==

    千次阅读 2021-08-29 20:24:51
      浮点数在内存中的存储有舍入误差,在计算机中用近似表示任意某个实数。...  所以不能用==来判断两个double是否相等,而是, const double eps = 1e-8; if(abs(a-b) <= eps) 相等 else 不相等 ...
  • 不能转为字符串进行比较,因为转为字符串后,浮点值带小数点,整数值不带,这样它们永远都不相等; 不能使用compareTo方法进行比较,虽然它们都有compareTo方法,但该方法只能对相同类型进行比较。 整数、...
  • java中double类型判断相等

    千次阅读 2019-02-13 21:13:20
    通过设定一个允许的误差值,对待判断是否相等的两个double类型数据做差求绝对值再和允许的误差做比较来判断是否相等double d1=0.0000001; double d2=0d; //错误写法: if(d1==d2) ... //正确写法 ...
  • double类型是否相等判断方法 在Java中int类型数据的大小比较可以使用双等号,double类型则不能使用双等号来比较大小,如果使用的话得到的结果将永远是不相等,即使两者的精度是相同的也不可以。下面介绍两种比较...
  • C#中判断浮点数double/float是否相等

    千次阅读 2022-04-28 16:50:12
    二、float型与float型如何判断相等 浮点数的表示是不精确的,不能直接比较两个数是否完全相等,一般都是在允许的某个范围内认为像个浮点数相等, 如有两个浮点数a,b,允许的误差范围为1e-6,则abs(a-b)<=1e-6,...
  • double类型是否相等判断方法

    万次阅读 2017-06-20 20:09:18
    对于double类型,比如double d1=0.0000001,double d2=0d 当判断两个数据d1和d2是否相等的时候,一般不直接使用if(d1==d2) ...我们一般认为偏差在一个较小的范围内则两个数据是相等的。 正确的代码如下:public ...
  • float,double判断相等

    2018-07-07 16:36:17
    bool DoubleEqual(double v1, double v2){ return (v1 &lt;= (v2 + DBL_EPSILON)) &amp;&amp; (v1 &gt;= (v2 - DBL_EPSILON));} bool FloatEqual(float v1, float v2){ return (v1 &lt;= (v2 +...
  • double类型判断是否相等

    千次阅读 2018-09-04 20:18:21
    =”来判断duble类型,使用sonar等代码规范扫描会报如下错误:Floating point math is imprecise because of the challenges of storing such values in a binary representation. Even worse, floating point math ...
  • 判断两个float或double是否相等

    万次阅读 2017-02-08 15:12:22
    double a, b; ... if(a==b) ...不用考虑初始化的问题哈,此处不是说明那个问题。不能直接 if(a==b)而是要equal(a,b)equal 函数自己写public boolean equal(double a, double b) { if ((a- b> -0.000001) && (a- ...
  • c++ 判断两个double是否相等

    千次阅读 2015-08-20 16:28:00
    #include <stdio.h> #include <iostream> #include<math.h> using namespace std;...bool equal(double num1,double num2) { if((num1-num2>-0.000001)&&(num1-n...
  • double类型值相等判断

    千次阅读 2017-01-16 19:34:50
    两实数相等:两实数的差在允许的范围内认为相等既可认为是相等的。范围:1e-6(0.000001)主要代码:int IsEqual(double a,double b) { return fabs(a-b) ; }整个判断代码#include #include using namespace std;...
  • 计算机判断两个数相等,将判断所有的二进制位是否相等,当所有的位都相等时,两个数才相等,绝对的相等。 解决方法: 万物没有绝对相等的概念,在我们的程序中:对小数来说,保留小数点后几位就足够了,因此两个小数...
  • 关于 Double类型如何判断是否相等

    千次阅读 2018-10-12 18:44:16
    我是这样想的... public class MainActivity extends AppCompatActivity { ... private double d1=0.11, d2=0.21; private static final double d = 0.0001; @Override protected void onCreate(Bundle sav...
  • [C++]Double类型判断相等不能用==

    千次阅读 2019-04-04 16:17:16
    double类型用==判断相等为什么不行 double类型在计算机中是个近似数,并不能保证所有位数全部精准 1.举个例子 #include "pch.h" #include <iostream> int main() { double a = 4; double b = 0.1; double ...
  • 浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2...1、将字符串转换为float、double过程存在
  • 我们在判断浮点数相等时,推荐用范围来确定,若 x 在某一范围内,我们就认为相等,至于范围怎么定义,要看实际情况而已了, float, 和 double  各有不同   所以 const float EPSINON = 0.00001;   if((x >= - ...
  • 今天在实际情况中遇到一个问题 我在表中判断找出两列不相等的值 发现明明两个值相等确找出来了 最后发现 实际在于 double类型的精度 问题 最后通过保留小数位的方法解决了
  • 首先,浮点数在计算机中并不能精确的表示,所以在判断两个double类型的数时需要其他的手段,而不是直接 double temp1 = 0.0, temp2 = 0.0; if (temp1 == temp2) { .... } 最好的是选择一个合适的精度,来进行...
  • C++知识点:double型和float型判断相等

    千次阅读 2017-07-17 10:57:34
    由于计算机表示小数(包括float和double型小数)都有误差,我们不能直接用符号(==)判断两个小数是否相等,如果两个小数的差的绝对值很小,比如,小于 0.0000001,就可认为他们相等。 bool equal(double a, double...
  • 判断两个double/float是否相等

    万次阅读 2022-04-18 13:10:09
    浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。 浮点数采用“尾数+阶码” 的编码方式,类似于科学计数法的“有效数字+指数” 的表示方式。二进制无法精确表示大部分的十进制...
  • 上大学时看林锐博士的《高质量C/C++编程...千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。假设浮...
  • 在我们写测试用例时,难免要对各种数据类型是否相等进行判断。前几天在对两个double类型利 用aseertEquals进行判断时,遇到了下面的问题:精简化问题如下: 在这个例子中double类型h与y的值都为0.1,但...
  • 比较Java中的相等double值。

    千次阅读 2021-07-16 20:21:49
    I would like some advice from people who have more experience working with primitive double equality in Java. Using d1 == d2 for two doubles d1 and d2 is not sufficient due to possible rounding errors...
  • 判断double类型值是否相等

    千次阅读 2019-04-11 09:59:37
    看了一些网上的方法都觉得有点不太好,后来想到:直接判断两个double值的差值是否与0相等即可。
  • double f2 = 1/10; System.out.println(f1); System.out.println(f2); System.out.println(f1==f2); System.out.println("------------"); float f3 = 1234123412341234f; float f4 = f3 + 1; ..

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,151
精华内容 38,860
关键字:

double判断相等