title: Comparing a double against zero
body: <p>I'm new to Java and I've been trying to implement an algorithm for finding the roots of a cubical equation. The problem arises when I calculate the discriminant and try to check where it falls relative to zero.</p>
  
  <p>If you run it and enter the numbers "1 -5 8 -4", the output is as follows:</p>
  
  <pre><code>1 -5 8 -4
  p=-0.333333, q=0.074074
  disc1=0.001372, disc2=-0.001372
  discriminant=0.00000000000000001236
  Discriminant is greater than zero.
  </code></pre>
  
  <p>I know the problem arises because the calculations with doubles are not precise. Normally the discriminant should be 0, but it ends up being something like 0.00000000000000001236.</p>
  
  <p>My question is, what is the best way to avoid this? Should I check if the number falls between an epsilon neighborhood of zero? Or is there a better and more precise way?</p>
  
  <p>Thank you in advance for your answers.</p>
  
  <pre><code>import java.util.Scanner;
  
  class Cubical {
      public static void main(String[] args) {
          // Declare the variables.
          double a, b, c, d, p, q, gamma, discriminant;
  
          Scanner userInput = new Scanner(System.in);
          a = userInput.nextDouble();
          b = userInput.nextDouble();
          c = userInput.nextDouble();     
          d = userInput.nextDouble();
  
          // Calculate p and q.
          p = (3*a*c - b*b) / (3*a*a);
          q = (2*b*b*b) / (27*a*a*a) - (b*c) / (3*a*a) + d/a;
  
          // Calculate the discriminant.
          discriminant = (q/2)*(q/2) + (p/3)*(p/3)*(p/3);
  
          // Just to see the values.
          System.out.printf("p=%f, q=%f\ndisc1=%f, disc2=%f\ndiscriminant=%.20f\n", p, q, (q/2)*(q/2), (p/3)*(p/3)*(p/3), (q/2)*(q/2) + (p/3)*(p/3)*(p/3));
  
          if (discriminant &gt; 0) {
              System.out.println("Discriminant is greater than zero.");
          }
          if (discriminant == 0) {
              System.out.println("Discriminant is equal to zero.");
          }
          if (discriminant &lt; 0) {
              System.out.println("Discriminant is less than zero.");
          }
      }
  }
  </code></pre>