【问题标题】:Unity3D - playerpref values changes to negative when its over 2billionUnity3D - playerpref 值超过 20 亿时变为负数
【发布时间】:2018-10-09 11:35:07
【问题描述】:

我正在开发一款闲置的点击游戏,一切似乎都很完美,直到货币价值超过 20 亿,然后价值变为负数。似乎统一播放器的价值超过 2,154,000,000 有问题......我该如何解决这个,下面的代码保存并加载分数..

public int LoadCoinsAmount()
{
    return PlayerPrefs.GetInt("COINS");
}

public void SaveCoinsAmount(int coins)
{
    PlayerPrefs.SetInt("COINS", coins);
}

..请帮忙

【问题讨论】:

  • 请在提问前阅读stackoverflow.com/help/how-to-ask
  • 这是一个数学溢出,你使用一个 int 作为变量,他的最大值是 2,147,483,647。将其更改为 double 或 float 以表示更高的数字。
  • @AlbertoCh 显而易见的选择是下一个最宽的 integral 类型 (long),而不是切换到 IEEE 浮点数。
  • 在这种情况下,您甚至可以选择System.Numerics.BigInteger
  • 所有这些建议都很棒,但没有得到 OP 的确认,它们都是猜测。请提供您的“货币价值”上限的详细信息,这样您就不会得到一堆令人困惑和相互矛盾的建议。

标签: c# unity3d


【解决方案1】:

虽然保存到浮点数是其他人提到的一个选项,但我建议在这种情况下使用适当的类型 long。 long 具有更高的精度。

实施:

public long LoadCoinsAmount()
{
    string coinString = PlayerPrefs.GetString("COINS");
    if (long.TryParse(coinString, out long result))
    {
        return result;
    }

    return 0;
}

public void SaveCoinsAmount(long coins)
{
    PlayerPrefs.SetString("COINS", coins.ToString());
}

【讨论】:

    【解决方案2】:

    正如我评论你的那样,你应该改变你的变量类型,在本例中为浮点数,这是 Unity 中唯一支持保存在 PlayerPrefs 中的变量类型。所以你的代码会是这样的:

    public float LoadCoinsAmount()
    {
        return PlayerPrefs.GetFloat("COINS");
    }
    
    public void SaveCoinsAmount(float coins)
    {
        PlayerPrefs.SetFloat("COINS", coins);
    }
    

    【讨论】:

    • 哟..我必须说..你太棒了..它就像魔术一样..谢谢
    • 根据here,使用浮点数会降低可用精度(31 位 -> 24 位)。字符串编码的 long 会好多更好(64 位),尤其是在点击器(单位)计数器的建议上下文中。
    • 今天的有趣游戏:这个循环会完成吗? for (float i = 16777216f; i < 16777220f; i++) { Console.WriteLine(i.ToString("R")); }你明白为什么吗?
    • @Sirwhite2015 如果16777216f == 16777217f(确实如此),您认为继续解决您的问题是否明智?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2019-03-11
    • 1970-01-01
    • 2019-06-07
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多