Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的奇异浮点数运算#_C#_Unity3d - Fatal编程技术网

C# C语言中的奇异浮点数运算#

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;

它是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;

        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。我在这里得到了答案。