长话短说,在过去的 2-3 天里,我一直在解决我的图形计算器中的一个错误,该错误是在我实现新的窗口调整大小监听器时出现的。错误是当我缓慢调整窗口大小时,函数不会正确转换,如果我快速移动它,它们会转换得很好。我查看了我所有的公式和算法,一切都很准确(与我之前的窗口大小调整方法相同)。每当宽度发生变化时,我都会取其变化的差异,将其除以 2 并将图形移动该数量。真的很简单。
double changeX = (newCanvasWidth - canvasWidth)/2;
double changeY = (newCanvasHeight - canvasHeight)/2;
这工作得很好,并且在将近 3 天的时间里,我需要忽略它作为罪魁祸首,这是合乎逻辑的。太天真了,我几乎重写了我的整个程序来尝试解决这个问题,从补偿算法到预测这些错误并修复它们的所有新方法。这变成了一场噩梦,令人难以置信的烦人。在放弃完全希望之前,我决定再次调查这个问题,使用与此相关的每一个计算的彻底跟踪并输出这些计算的结果,我发现了一些奇怪的东西。每当 (newCanvasWidth - canvasWidth) 之间的差异是奇数时,我就没有得到整数末尾的一半。
因此,如果它们之间的差异为 15,则 changeX 将反射(reflect) 7。最麻烦的是当差异为 1 时,changeX 将为 0。
在发现这一点后,我当然尝试了显而易见的事情并输入了减法。
double changeX = (double)(newCanvasWidth - canvasWidth)/2;
double changeY = (double)(newCanvasHeight - canvasHeight)/2;
你瞧,我的问题已经解决了!
但我不明白的是为什么这不会自动发生。另外,如果这只是我必须一直做出调整的事情,限制在哪里?无论如何,您是否知道什么时候需要输入像这样的强制转换简单计算?
最佳答案
Java 不会自动将整数表达式扩展为 float ,因为这样做的计算成本非常高,而且可能会失去精度。是的,如果您有一个整数值并希望除以一个非整数商,您将始终需要告诉 Java(和 C/C++)这一点。 Java 语言规范有 comprehensive rules关于数学表达式是什么类型的值。
像这样使用数字字面量的一个捷径是使字面量成为浮点类型:
double changeX = (newCanvasWidth - canvasWidth) / 2.0;
关于java - 究竟什么时候需要类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19056247/