Search code examples
c#.netdouble

Comparing double values in C#


I've a double variable called x. In the code, x gets assigned a value of 0.1 and I check it in an 'if' statement comparing x and 0.1

if (x==0.1)
{
----
}

Unfortunately it does not enter the if statement

  1. Should I use Double or double?

  2. What's the reason behind this? Can you suggest a solution for this?


Solution

  • It's a standard problem due to how the computer stores floating point values. Search here for "floating point problem" and you'll find tons of information.

    In short – 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.


    You wanted to know the reason:

    Float/double are stored as binary fractions, not decimal fractions. To illustrate:

    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: 10.01 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….

    Since the binary notation cannot store it precisely, it is stored in a rounded-off way. Hence your problem.