How to get accurate touch.position?

I'm unable to get a consistently accurate touch.position or hit.point using the following script. Touching the screen prints the following targetLocation to the console:

16.8, 6.1, 0.0

16.6, 6.1, 0.0

9.0, 2.9, 0.0 ← this one is where I was actually touching!

16.4, 6.2, 0.0

function TouchTarget() { // called once per frame in Update
    var count : int = iPhoneInput.touchCount;	
    if(count == 1) {
    	var touch : iPhoneTouch = iPhoneInput.GetTouch(0);

    	if (touch.phase == iPhoneTouchPhase.Began) {
    		//var ray = Camera.main.ScreenPointToRay( Vector3( touch.position.x, touch.position.y ) );
    		var ray = Camera.main.ScreenPointToRay(touch.position);
    		var hit : RaycastHit;
    		if(Physics.Raycast(ray, hit)) {
    			targetLocation = hit.point;
    			targetLocation.z = 0.0; // ignore z
    			Debug.Log(targetLocation);
    		}
    	}
    }
}

I've also tried getting the touch position in the following ways, but each of them has the same random inaccuracy.

// one way
targetLocation = hit.point;
targetLocation.z = 0.0; // ignore z

// another way
targetLocation = touch.position;

// yet another way
var targetLoc : Vector2 = hit.point;
targetLocation = Vector3 (targetLoc.x, targetLoc.y, 0);

Any suggestions on where I might be going wrong?

Turns out that the problem is not with the code, but rather with my scene. Since I'm making a 2D side-scroller, I didn't have any collision on the background (nothing ever moves in Z so why would I need collision there?). After adding a collision box across my background, I am now getting accurate touch.position and hit.point.

I'm not very fermiliar with iPhone specifics, but since your question hasn't had an answer yet, I'll shoot anyway: It looks like you're not correctly dealing with the situation where there would be more than one touches. Instead of dealing with all of them, you currently deal with none of them. You only do something if there is exactly one touch.