Прежде всего, e-12 - это 10 ^ -12 или, в вашем случае, -0.000000000005089218. Возможно, это происходит из-за математического числа с плавающей точкой.
z не достигает 0, потому что вы используете функцию lerp без изменения коэффициента интерполяции в пути. Лерп означает линейную интерполяцию. Третий параметр, который он получает ( 1.0f * Time.deltaTime в вашем коде) - это коэффициент интерполяции. Если бы это отношение было 0,5, значение z перешло бы к среднему значению разницы (то есть (0 - 4,167) * 0,5). Например; Lerp (0, 1, 0.5f) заставляет его перейти на 0,5 в следующем кадре и на 0,75 в другом.
Давайте рассмотрим, как ваша игра работает со скоростью 60 кадров в секунду. Это делает Time.deltaTime = 1/60. Когда Lerp начинает выполняться в вашем коде, z составляет 4,167 в первом кадре. Вы хотите, чтобы он достиг нуля. Коэффициент интерполяции равен 1,0f * Time.deltaTime, что составляет 0,01666 ... или 1/60. Это означает, что z переместится на 1/60 от разницы.
Во втором кадре z достигает (4.167 + (0 - 4.167) / 60) = 4.09755 В третьем кадре z достигает (4.09755 + (0 - 4.09755 / 60) = 4.0292575
Это можно преодолеть, проверив значение z по отношению к значению допуска.
if (rotateHead)
{
const float end = 0f;
var rotation = transform.rotation;
var z = Mathf.Lerp(rotation.z, end, 1.0f * Time.deltaTime);
const float tolerance = 1f;
if (Math.Abs(z - end) < tolerance) z = 0;
head.transform.rotation = Quaternion.Euler(rotation.x, rotation.y, z);
}