C# 中奇怪的浮点数操作操作



It's 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.3333333333...( 的二进制等价物,不能用十进制精确表示。

您可以通过尝试在此处将 4.2 转换为二进制来检查这一点

(确保检查单精度(在结果中,如果您看到精确检查,则表示它无法以二进制精确表示。

4.2 变为 100.00110011001100110011,十进制为 4.19999980926513671875

转换为 int 只会删除小数部分。 因此,当转换为 int 时,41.9999980926513671875 变为 41。

您不应该真正转换为 int,尤其是浮点值,以避免出现这样的意外结果。只需进行四舍五入即可。

最新更新