Solution 1:

It is true.

It is an inherent limitation of how floating point values are represented in memory in a finite number of bits.

This program, for instance, prints "false":

public class Main {
  public static void main(String[] args) {
    double a = 0.7;
    double b = 0.9;
    double x = a + 0.1;
    double y = b - 0.1;
    System.out.println(x == y);
  }
}

Instead of exact comparison with '==' you usually decide on some level of precision and ask if the numbers are "close enough":

System.out.println(Math.abs(x - y) < 0.0001);

Solution 2:

This applies to Java just as much as to any other language using floating point. It's inherent in the design of the representation of floating point values in hardware.

More info on floating point values:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

Solution 3:

Yes, representing 0.1 exactly in base-2 is the same as trying to represent 1/3 exactly in base 10.