unity c# Mathf.FloorToInt(-0.5) returns 0(表现得像Mathf.CielToInt)

unity c# Mathf.FloorToInt(-0.5) returns 0 (acts like Mathf.CielToInt)

这是 Mathf.FloorToInt 的脚本参考文档 如您所见,它应该将 -0.5 舍入为 -1。出于某种原因,在我的计算中使用时,它似乎 return 为 0。

我有两个相同功能的版本,它们的工作方式非常相似,但输出不同。我的代码只会向这些函数提交 3 到 18 之间的整数。

这个版本就像使用 Mathf.CielToInt 一样(returns 0 在 statRoll = 9 的情况下):

    public int getBonus(int statRoll)
{
    int result = Mathf.FloorToInt((statRoll - 10) / 2);
    return result;
}

这是有效的版本(returns -1 在 statRoll = 9 的情况下):

    public int getBonus(int statRoll)
{
    float initial = statRoll - 10;
    float divided = initial / 2;
    int result = Mathf.FloorToInt(divided);
    return result;
}

您正在通过整数除法得到位。 statRoll10 都是 int 类型,这使得 initial 实际上是 int

您的第一个代码等同于

public int getBonus(int statRoll)
{
    int initial = statRoll - 10;
    int devisor = 2;
    int divided = initial / devisor;
    float castDevided = (float)divided
    int result = Mathf.FloorToInt(castDevided);
    return result;
}

当您执行 -1 / 2 时,您有两个整数,计算结果为 0 而不是 -0.5 因为结果也必须是一个整数。解决此问题的方法是将两个值之一设置为 float

public int getBonus(int statRoll)
{
    int result = Mathf.FloorToInt((statRoll - 10) / 2f); //adding f after a number makes it a float
    return result;
}

这使得 intfloat 之间的划分产生了浮点数。类似的代码是

public int getBonus(int statRoll)
{
    int initial = statRoll - 10;
    float devisor = 2f;
    float divided = initial / devisor ;
    int result = Mathf.FloorToInt(divided);
    return result;
}