为什么在 C# PointF 中浮点运算 return 整数?

Why float operation return integer numbers in C# PointF?

我有以下使用所有平面数据类型的语句。

ScaledCordinates.BottomRight = new PointF(((float)ScaleBottomRight.X * (float)Scale), ((float)ScaleBottomRight.Y * (float)Scale));

分配给 "ScaleBottomRight.X" is 2.36523485"ScaleBottomRight.Y" is 2.38020468 的值。 "Scale" = 66.80098.

我不明白为什么 "ScaledCordinates.BottomRight" 在我的应用程序中给我 {X = 158 Y = 159}。 为什么float运算是returns整数值?有时输出是整数,有时是浮点数,这甚至令人沮丧。我在 double 和 float 之间进行了各种转换,但结果相同。解决这些问题的最佳方法是什么?输出应为“浮点”数据类型。

2.36523485 * 66.80098 = 158.000005910153

2.38020468 * 66.80098 = 159.0000052245864

它们的小数部分都太小,无法适应浮点精度,根据 the docs,浮点精度约为 6-9 位。虽然乘法的结果仍然是float(即System.Single):

Console.WriteLine((2.36523485f * 66.80098f)); // prints "158"
Console.WriteLine((2.36523485f * 66.80098f).GetType()) // prints "System.Single"

我假设无论类型 ScaledCordinates.BottomRight 是什么,它的 XY 属性(字段的)都是类型 int.

例如,它可能是类型 Point, whose X and Y are ints: X docs. Y docs

您可以将其更改为其他类型。但只要它们是 ints - 你就不能保留浮点信息。