Very Accurate Crop

I’m trying to make the background of my main menu scroll throughout an image in a circular pattern. I took a 4096 x 2048 image and crop it to fill the screen. I “scroll” through it by changing the crop region using the following script:

#pragma strict

var texture : Texture2D;
var textureCrop : Rect;

var width : float = 0;
var height : float = 0;
var ox : float = 0;
var oy : float = 0;
var dir : float = 0;
var radius : float = 0;

private var cropRect1 : Rect;
private var cropRect2 : Rect;

function Start () {
	var ratio : float = Screen.width/(1.0*Screen.height);
	height = 0.3f;
	width = ratio * height;
		
	dir = 0;
	radius = (1f - width)/2f;
	ox = (1f - width)/2f;
	oy = (1f - height)/2f;
	
	textureCrop.width = width;
	textureCrop.height = height;
	
	cropRect1 = new Rect( 0, 0, Screen.width, Screen.height );
}

function Update () {
	dir = (dir + (0.6f * Time.deltaTime)) % 360;
	textureCrop.x = ox + Mathf.Cos(Mathf.Deg2Rad * dir) * radius;
	textureCrop.y = oy + Mathf.Sin(Mathf.Deg2Rad * dir) * radius;
	
	cropRect2 = new Rect( -texture.width * textureCrop.x, -texture.height * textureCrop.y, texture.width, texture.height );
}

function OnGUI() {
    GUI.BeginGroup( cropRect1 );
    GUI.DrawTexture( cropRect2, texture, ScaleMode.ScaleAndCrop );
    GUI.EndGroup();
}

The one problem is that the image’s movement is choppy. When I speed up its movement it smooths out considerably, but still remains choppy. After some playing around I believe that the issue is that the crop is only accurate to about 3 decimal places. Is there a way to make the crop more accurate?

BG.cs

using UnityEngine;
public class BG : MonoBehaviour
{
	public Texture2D texture;
	void OnGUI()
	{
		if (Event.current.type == EventType.Repaint)
		{
			float radius = 0.5f - 0.15f * (float)Screen.width / (float)Screen.height;
			Vector3 offset = new Vector3(radius, 0.35f, 0f) + Quaternion.AngleAxis(Time.time * 0.6f, Vector3.forward) * Vector3.right * radius;
			Rect screenRect = new Rect(0, 0, Screen.width, Screen.height);
			Rect cropRect = new Rect(-offset.x, -offset.y, (float)Screen.width / (float)texture.width, (float)Screen.height / (float)texture.height);
			GUI.DrawTextureWithTexCoords(screenRect, texture, cropRect);
		}
	}
}