To answer your float/double question, decimal numbers don't have infinite accuracy due to their representation in binary. As you can see you're 0.000000000001 out due to that. This is usually why choosing your data type and rounding appropriately are important. Different data types have different accuracies.
Your third question seems like there's something else underneath which you aren't asking. I'll answer it as generally as possible. Method Overloading like that is used for when you want to use one function for multiple different data types, or different amounts of them, and you require it to be handled differently per case.
Easiest way to see it in action is the '+' operator.
String x = "32" + "4";
System.out.println(x); // Outputs 324
int y = 2 + 4;
System.out.println(y); // Outputs 6
Two strings concatenate, two numbers add together. With an overload for every combination of data types that "+" can support.