Debug.Log((int)(4.2f * 10.0f));
结果:41(在Unity 2017.2.1p4中)
结果:42(在Unity 5.4.3p4中)
为什么它不同?
答案 0 :(得分:2)
浮点数使用近似表示,而float数学不是确定性的。相同的计算可以给出不同的结果,特别是在不同的计算机,体系结构或编译器和优化设置上。
因此,Unity 5.4.3p4和Unity 2017.2.1p4之间的编译器和优化设置可能存在差异。
在您的示例中,4.2f * 10.0f
可能会产生不同的值,例如41.9999998f
或42.0000002f
,它们将分别转换为整数41或42。
有关详细信息,请参阅以下帖子:
答案 1 :(得分:2)
(单精度)浮点4.2f
和10.f
的乘积的确切结果是
41.9999980926513671875
此精确结果的最近浮点数为42.0f
但是这个精确的结果符合双精度,所以如果表达式以单精度计算,它将打印42,但如果以双精度计算,则它将打印41。
IOW,表达式可以分解为:
x = 4.2f;
x = x * 10.0f;
Debug.Log((int)(x));
如果编译器决定保留单个精度x,它将打印42,但如果它决定以双精度计算x,它将打印41。