Without looking too deeply into your code, I have an idea of what is likely the issue.
Your "source rectangle" is
and your sprite sheet, I'm guessing, is 64x48? That's what it looks like in your image.
Anyway, 32/48 is .666..., which, when stored as a binary float, actually comes out to be 5592405/2^23, or 0.66666662693023681640625. Notice that this is less than 32/48's true value. As such, the sampler grabs part of the pixel above.
If this is indeed the issue, one easy way to overcome it is to make your sprite sheet a power of 2 in each dimension (like 64x64), as then it won't have any awkward "decimal" values to deal with. 32/64, for example, is .5, nice and easy!