Math.Round问题

时间:2014-10-13 00:15:13

标签: c#

我试图为我的游戏创建一个时钟。我的小时和秒都是浮动值,所以我使用Math.Round将它们四舍五入到最接近的整数。问题是小时和秒数变量根本没有变化。我使用Math.Round错了吗?

public void Update()
    {
        Hours = (float)Math.Round(Hours, 0);
        ClockTime = Hours + ":" + Seconds;
        if (Hours >= 24)
            Hours = 0;
        if (Seconds >= 60)
            Seconds = 0;
    }

在我的日/夜课程的更新方法中。

        float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;

        clock.Hours += (float)elapsed;
        clock.Update();

当我在屏幕上打印数字时,没有任何变化。如果我将(float)强制转换为Math.Round,我会得到一个错误,无法将double转换为float。

2 个答案:

答案 0 :(得分:3)

在这种情况下,

不要使用浮点数,完全没有理由让小时,分钟或秒钟成为非整数。

几乎可以肯定的是,尽管你认为你正在进行四舍五入,但你最终会得到59.9999的浮动值。

假设浮点值的精度高于实际值,确实存在危险。

如果你以无符号积分32位类型保持你的秒数,你可以表示从现在到大约公元2150年的经过时间,如果有人仍然在那时玩你的游戏: - )

然后你只需使用整数计算来计算小时和秒(假设你似乎对分钟不感兴趣),伪代码如:

hours = elapsed_secs / 3600
secs = elapsed_secs % 3600
print hours ":" seconds

除了这个建议之外,你所做的事情似乎有点奇怪。您正在向小时变量添加经过的秒数字段(我假设您已经检查过并且始终设置为零)。随着时间的推移,游戏玩法的速度将达到正常速度的3.5倍。

答案 1 :(得分:0)

实际上,您应该使用DateTime来跟踪您的时间并使用DateTime属性来正确获取小时和秒,而不是使用float自己尝试几秒钟和几小时。 DateTime基于长期,支持从毫秒到千分之几,当然还有几秒。它具有内置的所有功能,可以正确地添加毫秒或数秒或者......或者......这实际上相当困难。