Java 将double(或float)转换为int时会发生什么情况?

Java 将double(或float)转换为int时会发生什么情况?,java,casting,2d,Java,Casting,2d,我正在练习一些简单的2D游戏编程,并提出了一个理论,即在动画过程中(图像位置的实际变化最好用浮点数计算)。我有一种感觉,如果你用int移动一个图像,动画就不会那么平滑了 在Java中,似乎无法用浮点数绘制图像来给图像定位。但是很显然,当您最初声明x和y时,您可以将它们声明为Double或Float,并且在实际绘制图像时,您必须将它们转换为int。就像我发现的: 我的问题是Java如何处理转换? 如果代码在最后一分钟强制转换这些双打,为什么首先要将它们作为双打? Java是否将数字隐藏在小数点后

我正在练习一些简单的2D游戏编程,并提出了一个理论,即在动画过程中(图像位置的实际变化最好用浮点数计算)。我有一种感觉,如果你用int移动一个图像,动画就不会那么平滑了

在Java中,似乎无法用浮点数绘制图像来给图像定位。但是很显然,当您最初声明xy时,您可以将它们声明为Double或Float,并且在实际绘制图像时,您必须将它们转换为int。就像我发现的:

我的问题是Java如何处理转换? 如果代码在最后一分钟强制转换这些双打,为什么首先要将它们作为双打? Java是否将数字隐藏在小数点后


我知道C和C++中小数后的数字被切断,你只能看到它之前的内容。Java如何处理这种转换?

Java通过删除小数点将浮点转换为int。但我认为浮动中的x和y坐标没有任何意义。屏幕上的像素不能少于一个像素。例如,您不能绘制像素
.5px x.5px
,因为在屏幕上它将只是
1px x 1px
像素。我不是电脑游戏程序员,但我用Java编写了一个动画引擎,它非常流畅。如果你愿意,我可以分享这个


请注意,您应该使用整数绘制,但所有计算都使用双精度。对于旋转或任何依赖于数学公式的事情,都应该用十进制进行

Java截断小数。例如:

(int) 2.34 == 2
(int) 2.90 == 2

无法在浮动位置绘制的原因很简单,因为没有半像素等:)

x和y需要是双精度的原因是因为它们需要进行数学计算,例如:

x += (delta * dx) / 1000;

在绘制像素之前,您希望避免溢出和精度损失。

显示器上的像素是离散的,并且数量有限;因此,显示坐标必须是整数-浮点数没有意义,因为您在物理上没有像素,例如
(341.4234,7)

也就是说,整数只能在最终绘图阶段使用。计算对象移动、速度等时,需要使用浮点数。整数将导致数量惊人的精度问题。考虑下面的片段:

a = 1;
x = (a / 2) * 2;
如果
a
x
是浮点数,
x
最终将具有所需的
1
。如果它们是整数,您将得到
0

基线:在物理计算中使用浮点类型,并在绘图时转换为
int
。这将允许您以所需的精度执行物理计算

编辑:

就从FP数到整数的转换而言,虽然FP数具有更大的范围,但在标准化到绘图区域大小后,物理计算生成的值通常不会溢出
int
类型


也就是说,Java在转换为整数类型时会截断浮点数,这可能会创建瑕疵(例如,由于将
639.9
转换为
639
而不是
640
,因此最右边的像素列没有像素的动画)。你可能想看看java或C++提供的其他舍入方法,以获得更合理的结果。您应该尽可能多地使用double进行计算,当您最终将其传递给接受int的方法时,您需要执行Math.round()。因此,我猜在铸造double之前,它的计算将尽可能接近最精确的int?(如果这有道理的话)浮点数是有用的,原因有很多——其中,
sin
/
cos
(几乎是体面旋转的必要条件)实际上需要浮点数,而且许多矩阵运算可以从数取分数的能力中受益。如果将它们转换为整数,最终会失去很多灵活性(除非您想编写自己的整数trig函数等等)。很多人会将它们作为双精度或浮点数保存,直到它们必须是整数。这是真的。我不是故意用整数来计算的。在我的应用程序中,我仍然使用double进行所有计算,并使用int进行绘制。我将更新以反映此注释。@AmirRaminfar我可以看一下吗?你当然可以。我用一个简单的动画队列实现了我自己的放松,该队列负责线程。它工作得很好,而且就代码行而言,它不是一个很大的问题。谢谢你的意见,这很有意义
a = 1;
x = (a / 2) * 2;