This seems to work as (pretty) well:
[Range(Double.NaN, 20)]
public byte? Amount { get; set; }
The lower limit is not checked upon. Not so handy if you want to check null || >= 0
. Off course server-side validation goes hand-in-hand with client-side validation where this (< 0) can be checked upon.