java - 究竟什么时候需要类型转换?

标签 java casting

长话短说,在过去的 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/

相关文章:

java - 在 guice 中,@provides 和 bind() 之间有区别吗?

c++ - 从 int 到 int** C++ 的无效转换

c++ - 在指针中存储无符号整数

c# - 为什么我可以将对象与这些对象的 IEnumerable 进行比较,而不是列表?

c# - 如何显示asp.net缓存的内容?

C# 泛型 : cast generic type to value type

java - ListView 项目中的按钮

java - 热部署在内部是如何工作的?

java - 如何在 log4j2 属性中设置类的日志级别

java - 从 com.google.gwt 对 pom.xml 的依赖中排除 javax.servlet 包