use decimal instead of float to avoid rounding issues