Are we missing a NormalisableRange::snapToLegalValue (value) call somewhere?
By default the NormalisableRange doesn’t do this, nor does AudioParameterFloat. However the more modern AudioParameterValueTreeState does automatically snap parameter values to the set interval (and provides a nice way of automatically binding to a slider or knob). Could you try with this and see if that’s the problem?
