【发布时间】:2021-03-15 13:59:21
【问题描述】:
我有以下代码:
public float SnapValueToCoreBlock(float ValueToSnap)
{
ValueToSnap = ValueToSnap + 0.5f;
ValueToSnap = Mathf.Floor(ValueToSnap);
return ValueToSnap;
}
float floatvar;
int intvar;
for (int z = 0; z < 100; z++)
{
floatvar = z + (Mathf.FloorToInt(0.499999f) + 1) * 0.499999f / (Mathf.FloorToInt(0.499999f) + 1);
intvar = (int)SnapValueToCoreBlock(floatvar);
}
我希望循环中的“intvar”始终等于“z”,但是在 31 次迭代后会出现某种舍入误差,并且当 z=32 intvar = 33 而不是 z=32 intvar =32
从那时起 intvar 总是减 1,因此对于 z31 intvar=z+1
我的预期结果是 z = intvar 总是,我不明白为什么当 z 达到 32 时这会任意改变,如果有人可以帮助我,我将不胜感激,提前致谢。
【问题讨论】:
-
可能是四舍五入的问题,一旦你达到 32 位,你的小数位就会强制它对一个数字进行四舍五入。如果你达到 64 或其他东西,它会偏离 2 点吗?也许在不强制转换的情况下测试你的值,看看你的 31 数字是什么,看看它是否会四舍五入。
-
对于 64 它仍然关闭 1,因此 z=64 给出 intvar=65,对于 z=99 intvar =100,并且 floatvar 始终显示 z.5,即对于 z=1 floatvar = 1.5 , 对于 z = 70 floatvar = 70.5
-
我把 64 作为猜测扔了出去,可能是 70 或 80,或者当你施放它时计算可能会导致它四舍五入。我会调试并逐步查看我们第 31 次查看的所有数字,然后查看其中一个是否可能导致舍入问题(仍然不确定是否是这样,但是自从你铸造你的浮动后需要看看到 int)。
-
如果你想使用浮点数,你不能使用像
0.4999999f这样的数字。请记住,浮点数只有 6-9 位精度,而您有 7 位。 -
我编辑了我的答案,如果你有兴趣
标签: c# unity3d math floating-point formula