How can a primitive float value be -0.0? What does that mean?

Because Java uses the IEEE Standard for Floating-Point Arithmetic (IEEE 754) which defines -0.0 and when it should be used.

The smallest number representable has no 1 bit in the subnormal significand and is called the positive or negative zero as determined by the sign. It actually represents a rounding to zero of numbers in the range between zero and the smallest representable non-zero number of the same sign, which is why it has a sign, and why its reciprocal +Inf or -Inf also has a sign.

You can get around your specific problem by adding 0.0

e.g.

Double.toString(value + 0.0);

See: Java Floating-Point Number Intricacies

Operations Involving Negative Zero
...
(-0.0) + 0.0 -> 0.0

-

"-0.0" is produced when a floating-point operation results in a negative floating-point number so close to 0 that it cannot be represented normally.


how come a primitive float value can be -0.0?

floating point numbers are stored in memory using the IEEE 754 standard meaning that there could be rounding errors. You could never be able to store a floating point number of infinite precision with finite resources.

You should never test if a floating point number == to some other, i.e. never write code like this:

if (a == b)

where a and b are floats. Due to rounding errors those two numbers might be stored as different values in memory.

You should define a precision you want to work with:

private final static double EPSILON = 0.00001;

and then test against the precision you need

if (Math.abs(a - b) < epsilon)

So in your case if you want to test that a floating point number equals to zero in the given precision:

if (Math.abs(a) < epsilon)

And if you want to format the numbers when outputting them in the GUI you may take a look at the following article and the NumberFormat class.