I too am working on a binding with percentage value, namely relative humidity.
The API gives me a double value between 0 and 100 and in my case, I had to divide it by 100 to show properly in the UI or I would get 5420% RH instead of 54.2%.
I have the following definitions:
channels.xml
<channel-type id="humidity">
<item-type>Number:Dimensionless</item-type>
<label>@text/channel-type.airzone.zone.humidity.label</label>
<category>Humidity</category>
<tags>
<tag>Measurement</tag>
<tag>Humidity</tag>
</tags>
<state pattern="%.1f %%" readOnly="true" />
</channel-type>
thing-type-zone.xml
<thing-type id="zone">
<channels>
<channel id="humidity" typeId="humidity" />
</channels>
</thing-type>
Then in the thing handler code, I do this:
newState = new DecimalType(zone.getHumidity() / 100);
updateState(channelUID, newState);
This works right in openHAB4 and I believe it will do so in openHAB3 as well.