Material of mesh doesn't match the render because of subdivision surface
The subsurf modifier is designed to interpolate geometry in between existing vertices. The materials (and their borders) are interpolated as well.

You have a couple of options:

Select an edge loop and add a crease with a value of 1 (you can access the edge crease tool with Crl+E):



Or add a loop cut (Ctrl+R) and move it closer to the existing loops.