C# C语言中的奇异浮点数运算#
它是Unity Engine(v2018.1)C#,.Net 3.5的等效版本C# C语言中的奇异浮点数运算#,c#,unity3d,C#,Unity3d,它是Unity Engine(v2018.1)C#,.Net 3.5的等效版本 我得到了一个奇怪的浮点数运算 代码是这样的 float fa = 4.2f; float fb = 10.0f; float f1 = fa * fb; int i1 = (int)(fa * fb); int i2 = (int)f1; int i3 = (int)42.0f;
我得到了一个奇怪的浮点数运算
代码是这样的
float fa = 4.2f;
float fb = 10.0f;
float f1 = fa * fb;
int i1 = (int)(fa * fb);
int i2 = (int)f1;
int i3 = (int)42.0f;
Debug.Log(f1);
Debug.Log(i1);
Debug.Log(i2);
Debug.Log(i3);
// Log Result
//
// f1 : 42
// i1 : 41
// i2 : 42
// i3 : 42
//
i1就是问题所在整数类型转换给出41而不是42 有人能就这个问题给出提示吗?
FP精度或类型转换问题?4.2不能用二进制精确表示 它是1/3(0.3333…)的二进制等价物,不能用十进制精确表示 您可以通过尝试将4.2转换为二进制来检查这一点 (确保选中单精度)如果在结果中看到选中了不精确,则表示无法用二进制精确表示 4.2变为100.001100110011,十进制为4.19999980926513671875 转换为int只会删除小数部分。因此,41.99999092926513671875在铸造为int时变为41
您不应该真的强制转换为int,尤其是浮点值,以避免像这样的意外结果。改为四舍五入。太好了,谢谢。我明白为什么i1是41。如果你不介意的话,我想再问一个问题。为什么i2是42,而不是41。如果i1的情况是一样的,我想也应该是41。我在这里得到了答案。