scijava / scijava-ui-swing

SciJava UI components for Java Swing.
BSD 2-Clause "Simplified" License
7 stars 11 forks source link

Spinner increment/decrement precision problem #19

Open lnyng opened 8 years ago

lnyng commented 8 years ago

When collecting an input of double type, there might be precision problem using the spin up/down arrows. The code to produce the problem using script editor:

// @double(min="0.0001", max="5", value="0.0001", persist="false") a
print(a)

I think the problem is that the initial value 0.0001 is somehow rounded down to 0. Since the minimum value is 0.0001, so we are not able to change the value using the spinner.

Similarly, in this code segement:

// @double(min="0.001", max="5", value="0.001", persist="false") a
print(a)

we are able to increase the value from 0.001 to 1.001, but not going back from 1.001 to 0.001.

Not sure which part of the code cause this rounding error.

ctrueden commented 6 years ago

Confirmed that this is still a bug. (You may want to use Double instead of double during tests as of this writing, due to a separate and probably unrelated bug.) The problem also occurs with 0.0005, which suggests to me that it is not a decimal-to-binary IEEE floating point conversion issue, either. I am guessing this is some kind of rounding feature of the JSpinner class...

we are able to increase the value from 0.001 to 1.001, but not going back from 1.001 to 0.001.

Now this bug seems gone. That is: stepping down from 1.001 to 0.001 worked in my tests now.

imagejan commented 6 years ago

Interestingly, the value seems to be fine, as it is printed as 1.0E-4 in my tests (in Groovy).

Also, using a slider works fine to change the value:

#@ Double(min=0.0001, max=5.0001, value=0.0001, style=slider, persist=false) a
println a

(Note that I changed max to 5.0001 to work around another small bug with sliders adjusting to the max-min range...)