C# 在Unity3d中使用大浮点值作为计时器

C# 在Unity3d中使用大浮点值作为计时器,c#,unity3d,C#,Unity3d,我使用浮点数来计算和显示玩家完成游戏的剩余时间(秒) 在我的游戏中,时间有时会变快,所以剩余时间值需要变大 我的问题是:我在更新中使用了以下代码: Update () { timeleft -= Time.deltaTime; Debug.Log (timeleft); counter.text = "Time Left = " +timeleft.ToString("F0"); } 在游戏开始时,剩余时间值被

我使用浮点数来计算和显示玩家完成游戏的剩余时间(秒)

在我的游戏中,时间有时会变快,所以剩余时间值需要变大

我的问题是:我在更新中使用了以下代码:

  Update () {
            timeleft -= Time.deltaTime;
            Debug.Log (timeleft);
            counter.text = "Time Left = " +timeleft.ToString("F0");
    }
在游戏开始时,剩余时间值被设置为一个非常高的数字(3200万,大约一年的秒数)

时间下降的速度在游戏中是不同的,所以我使用了一个带有时间的浮动。deltaTime

Unity将这个较大的初始值存储为3.2E+07。 一旦发生这种情况,我的counter.text就不再正常工作,因为它只是等待下一个科学符号值出现。因此,看起来计时器文本被卡住了,而在后面,它实际上仍然在倒计时。希望我说的有道理。为免生疑问:计数器显示在值低于100万时工作正常

如何解决此问题?如何转换timeleft.ToString以使其显示正确的值

根据下面的评论,有人建议使用十进制。这对deltaTime不起作用,因为它需要一个浮点数,或者我误解了在哪里以及如何使用十进制


我试图创建一个新的int,并在浮点上使用Mathf.RoundToInt,但这不起作用:计时器停留在较大的值上。

这里的简短寓意是浮点运算不符合人类对数字的普通直觉

你写道:

Unity将这个较大的初始值存储为3.2E+07。一俟 碰巧,我的counter.text不再正常工作,因为 等待下一个科学符号值出现。看来 就像计时器一样,文本被卡住了,而在后面它实际上是静止的 倒计时

这是不正确的:不只是文本没有改变,对于
Time.deltaTime
的小值,数字本身也没有改变。问题是
float
的精度随着值的增大而降低。此外,由于底层存储格式为,因此很难直观地看出下一个最大值和下一个最小值之间的“差距”

您可以使用以下代码自己进行测试:

float f = 3.2e7f;
string s1 = f.ToString();
Console.WriteLine(s1);
string s2 = f.ToString("F0");
Console.WriteLine(s2);
string s3 = (f - 7).ToString("F0");

var f2 = f;
for (int i = 0; i < 3000000; i++)
{
    f2 = f2 - 1f;
}
var diff = f - f2;
Debug.Log(diff);
if (f2 == f) 
{
    Debug.Log("Floating point numbers are strange.");
}

这里的简短寓意是,浮点运算不符合普通人类对数字的直觉

你写道:

Unity将这个较大的初始值存储为3.2E+07。一俟 碰巧,我的counter.text不再正常工作,因为 等待下一个科学符号值出现。看来 就像计时器一样,文本被卡住了,而在后面它实际上是静止的 倒计时

这是不正确的:不只是文本没有改变,对于
Time.deltaTime
的小值,数字本身也没有改变。问题是
float
的精度随着值的增大而降低。此外,由于底层存储格式为,因此很难直观地看出下一个最大值和下一个最小值之间的“差距”

您可以使用以下代码自己进行测试:

float f = 3.2e7f;
string s1 = f.ToString();
Console.WriteLine(s1);
string s2 = f.ToString("F0");
Console.WriteLine(s2);
string s3 = (f - 7).ToString("F0");

var f2 = f;
for (int i = 0; i < 3000000; i++)
{
    f2 = f2 - 1f;
}
var diff = f - f2;
Debug.Log(diff);
if (f2 == f) 
{
    Debug.Log("Floating point numbers are strange.");
}

使用a而不是浮动?我尝试过相同的场景,我可以在场景中很好地看到值。但在inspector中显示为1e+07。如@rene所说,将浮点改为十进制。它工作得很好。可能与原始问题重复。建议的重复问题不适用,或者至少对我来说不清楚作为解决方案;(十进制)Time.deltaTime@killbert使用a代替float?我尝试过相同的场景,我可以在场景中很好地看到值。但在inspector中显示为1e+07。如@rene所说,将浮点改为十进制。它工作得很好。可能与原始问题重复。建议的重复问题不适用,或者至少对我来说不清楚作为解决方案;(decimal)Time.deltaTime@killbert尝试了这一点,但如果我这样做,Unity会给我这个错误:无法将类型
decimal'隐式转换为
float'。存在显式转换(是否缺少演员阵容?)啊,糟糕,错误来自其他地方。你的解决方案很有魅力。感谢你上了人类直觉的一课;-)尝试过,但如果我这样做,Unity会给我这个错误:无法将类型
decimal'隐式转换为
float'。存在显式转换(是否缺少演员阵容?)啊,糟糕,错误来自其他地方。你的解决方案很有魅力。感谢你上了人类直觉的一课;-)