I think you are misunderstanding what
gdal_sieve does. It merges connected regions smaller than a size threshold with their largest neighbors. For that to work, the values must be equal with a connected region.
With floats, equality is not well defined. If it is cast to integers under the hood, then everything in your image (values 0.2 to 0.75) will be cast to zero, and mixed in with your 0 NoData values. Even if you had values of 1, you say there are a lot of NoData areas, which means a portion of the 1 polygons will be merged with the zeros, unless you specify it as an excluded value.
As you say, when you have values greater than 1 in your dataset, it is able to proceed because you have ~60 (cast) integer values on which it can look for connected polygons.
The tool is usually used to clean up noisy categorical data (such as an 8-bit classification output, or a binary mask), not on float values. An alternative for you would be to set a threshold and produce a binary mask, then apply the sieve filter on the mask to get rid of small areas.