什么时候需要打字?

时间:2013-09-27 16:58:28

标签: java casting

这么长的故事短片我花了最后2-3天来解决我的图形计算器中的一个错误,当我实现一个新的窗口调整大小监听器时出现这个错误。错误是当我慢慢地调整窗口大小时,函数不能正常转换,如果我快速移动它们就会变好。我查看了所有的公式和算法,并且所有内容都是正确的(与之前的窗口大小调整方法相同)。每当宽度发生变化时,我都会改变它的差异,将其除以2并将图形移动该数量。真的很简单。

double changeX = (newCanvasWidth - canvasWidth)/2;

double changeY = (newCanvasHeight - canvasHeight)/2;

这个工作得很好,并且使我所需要的所有逻辑意义都要忽略这个作为近3天的罪魁祸首。它是如此无辜,我几乎重写了我的整个程序,试图解决这个问题,从补偿算法到预测这些错误并修复它们的所有新方法。它变成了一场噩梦,令人非常恼火。在放弃完全的希望之前,我决定再次使用与此相关的每一个计算的完整跟踪并输出这些计算的结果来调查问题,我发现了一些奇怪的东西。每当(newCanvasWidth - canvasWidth)之间的差异为奇数时,我就没有得到整数末尾的一半。

因此,如果它们之间的差异为15,则changeX将反映为7.最令人不安的是,当差异为1时,changeX将为0。

一旦发现这一点,我当然尝试了明显的事情并输入了减法。

double changeX = (double)(newCanvasWidth - canvasWidth)/2;

double changeY = (double)(newCanvasHeight - canvasHeight)/2;

瞧,我的问题已经解决了!

我不明白的是,为什么这不会自动发生。此外,如果这只是我必须在限制的所有时间进行调整的事情吗?反正知道你什么时候需要输入这样的简单计算?

4 个答案:

答案 0 :(得分:4)

Java并没有自动将积分表达式扩展到浮点数,因为它的计算成本非常高,并且因为你可能会失去精度。是的,如果你有一个你想要的积分值分成一个非整数商,你总是需要告诉Java(和C / C ++)。 Java语言规范有comprehensive rules关于数学表达式的值的类型。

使用这样的数字文字时的快捷方式是使文字成为浮点类型:

double changeX = (newCanvasWidth - canvasWidth) / 2.0;

答案 1 :(得分:2)

它并没有自动发生,因为在分配到(newCanvasHeight - canvasHeight)/2之前,分配的右侧(RHS)计算,即changeY作为单独的操作发生。由于RHS上的所有项都是整数,因此结果是一个整数,小数部分被截断(不是舍入),然后存储为双精度(因此7.5代替7,这是7.0存储为{{1}})。由于你在RHS上使用了一个常数项,你可以使它成为一个双精度(如@Clown建议),从而使计算结果在存储之前加倍。但是,如果RHS上的所有术语都是变量,那么你就会投出。

所以,是的,有一种方法可以知道何时需要在这样的情况下进行转换(或以其他方式转换):当分配的RHS最精确的术语不如LHS精确时。

答案 2 :(得分:1)

由于newCanvasWidthcanvasWidth被声明为int,因此在使用另一个整数进行分割时,不会自动获得小数结果。如果您不想演员,那么您应该使用2.0。 Java中的整数除法总是丢弃小数,除非你另有说明。

答案 3 :(得分:0)

如果结果有可能成为十进制数,例如使用除法时,应始终确保结果是双精度数。在这里你可以在必要时施放。但一般来说,您在不同的上下文中经常使用类型转换,例如从Object转到其他内容,或者,作为更好的示例,从View转到{{ Android中的1}}。

相关问题