web analytics

How to check if two double values are equal in the code?

Options

codeling 1595 - 6639
@2017-01-12 23:34:04

Question

In the following C# code, x, a  double variable, gets assigned a value of 0.1, the 'if' statement compares x with 0.1:

if(x==0.1)

{

    ----

}

Unfortunately, it does not enter the if statement, why does this happen?

@2017-01-12 23:50:02

It's a standard problem due to how the computer stores floating point values: Float/double are stored as binary fractions, not decimal fractions.  The following examples illustrate the what happens in computre:

12.34 in decimal notation (what we use) means 1*101+2*100+3*10-1+4*10-2.

The computer stores floating point numbers in the same way, except it uses base 2:  the base 10 number 2.25 can be convertd to base 2 number 10.01, which means 1*21+0*20+0*2-1+1*2-2

Now, you probably know that there are some numbers that cannot be represented fully with our decimal notation. For example, 1/3 in decimal notation is 0.3333333..., the same thing happens in binary notation, except that the numbers that cannot be represented precisely are different. Among them is the number 1/10. In binary notation that is 0.000110011001100...

In summary, a float/double can't store 0.1 precisely. It will always be a little off.

You can try using the decimal type which stores numbers in decimal notation. Thus 0.1 will be representable precisely.

Since the binary notation cannot store it precisely, it is stored in a rounded-off way. This is the cause to the above problem.

@2017-01-12 23:52:10

1/10 = 1/16 + 1/32 + 1/256 + 1/512+ 1/4096 + 1/8192 + ....

1/10 = 2-4 + 2-5 + 2-8 + 2-9 + 2-12 + 2-13 +....

@2017-01-12 23:59:49

double and Double are the same (double is an alias for Double) and can be used interchangeably.

The problem with comparing a double with another value is that doubles are approximate values, not exact values. So when you set x to 0.1 it may in reality be stored as 0.100000001 or something like that.

Instead of checking for equality, you should check that the difference is less than a defined minimum difference (tolerance). Something like:

if (Math.Abs(x - 0.1) < 0.0000001)

{

   ...

}

Comments

You must Sign In to comment on this topic.


© 2024 Digcode.com