这是我不理解的部分代码:

byte b1 = (byte)(64 / 0.8f); // b1 is 79
int b2 = (int)(64 / 0.8f); // b2 is 79
float fl = (64 / 0.8f); // fl is 80

为什么前两个计算相减一个?我应该如何执行此操作,以便快速而正确地进行?

编辑:我需要以字节为单位的结果

最佳答案

编辑:并非完全正确,请参见:Why does a division result differ based on the cast type? (Followup)

四舍五入问题:通过转换为字节/整数,您正在裁剪小数位。

但是64 / 0.8不应该导致任何小数位吗?错误:由于浮点数的性质,0.8f不能精确地表示为内存中的值;它存储为接近0.8f的值(但不完全是)。请参阅Floating point inaccuracy examples或类似线程。因此,计算结果不是80.0f,而是79.xxx,其中xxx接近1,但仍不完全是1。

您可以通过在Visual Studio的“立即窗口”中键入以下内容来验证这一点:

(64 / 0.8f)
80.0
(64 / 0.8f) - 80
-0.0000011920929
100 * 0.8f - 80
0.0000011920929

您可以使用舍入来解决此问题:
byte b1 = (byte)(64 / 0.8f + 0.5f);
int b2 = (int)(64 / 0.8f + 0.5f);
float fl = (64 / 0.8f);

10-07 13:17