ViewportToWorldPoint function is not correct in some situation

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Diagnostics;
using System.IO;

public class testTransform : MonoBehaviour {

	
	void Start ()
    {

        //if camera's "Near Plane=0.01" and "Position=(0,0,0)" the 11*11 line matrix will correct
        //if camera's "Near Plane=0.01" and "Position=(200,0,0)" the 11*11 line matrix will incorrect, result is 4*11 line matrix, (x=4, y=11)
        //if camera's "Near Plane=0.3" and "Position=(200,0,0)" the 11*11 line matrix will correct

        //test step:
        //1. run
        //2. mouse click on game screen
        //3. in "Scene" locate "cube", and watch the 11*11 line matrix result


        var camera = Camera.main;
        camera.nearClipPlane = 0.01f;
        camera.transform.position = new Vector3(200,0,0);
    }

    void Update () {
		if (Input.GetMouseButtonDown(0))
        {
            var camera = Camera.main;

            var pt0 = camera.transform.position;

            var screenPoint = Input.mousePosition;
            var viewport = screenPoint;
            viewport.x /= Screen.width;
            viewport.y /= Screen.height;
            viewport.z = 100;

            //create a cube to help locate in scene
            var pt0_world = camera.ViewportToWorldPoint(viewport);
            var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            cube.name = "cube";
            cube.transform.position = pt0_world;
            cube.GetComponent<Renderer>().material.color = Color.white;

            //create 11*11 line matrix
            for (float x = -5; x <= 5; x++)
            {
                for (float y = -5; y <= 5; y++)
                {
                    var pt = viewport;
                    pt.x += x * 0.0001f;
                    pt.y += y * 0.0001f;

                    var pt1 = camera.ViewportToWorldPoint(pt);
                    UnityEngine.Debug.DrawLine(pt0, pt1, Color.yellow, 100);

                    //var ray2 = camera.ViewportPointToRay(pt);
                    //UnityEngine.Debug.DrawRay(ray2.origin, ray2.direction * 100, Color.yellow, 100, true);
                }
            }

        }
    }
}

You just exhausted the range of the single precision floating point format. Keep in mind that the changes you apply to your view port position is extremely small. This normalized position actually represents a point on the near clipping plane. Since you set your near distance to such a small amount the actual size of the clipping plane is also extremely small. The clipping plane only has a size of “0.01” world units. So the points you’ve choosen only differ in “0.000001” units on the near clipping plane. This works as long as all coordinates are 0 or around 0. However floating point numbers only have a certain amount of significant digits. This never changes. Float only has 24 significant bits.

See this table how the min. possible step changes depending on the absolute number range of a floating point value