1

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

4 回答 4

4

Java 不会自动将整数表达式扩展为浮点数,因为这样做的计算成本非常高,并且可能会丢失精度。是的,如果您想要将一个整数值除以一个非整数商,那么您总是需要告诉 Java(和 C/C++)这一点。Java 语言规范对数学表达式的值类型有全面的规则。

使用像这样的数字文字时的一种快捷方式是将文字设为浮点类型:

double changeX = (newCanvasWidth - canvasWidth) / 2.0;
于 2013-09-27T17:04:43.883 回答
2

它不是自动发生的,因为赋值右侧(RHS)的计算,即(newCanvasHeight - canvasHeight)/2在赋值之前作为单独的操作发生changeY。由于 RHS 上的所有项都是整数,因此结果是一个整数,其小数部分被截断(不四舍五入),然后存储为双精度数(因此7.5您得到的不是 ,而是7存储为7.0)。由于您在 RHS 上使用了一个常数项,因此您可以将其设为双精度(如 @Clown 建议的那样),从而在存储之前将计算结果设为双精度。但是,如果 RHS 上的所有术语都是变量,那么您将进行转换。

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

于 2013-09-27T17:46:32.830 回答
1

因为newCanvasWidthandcanvasWidth被声明为int's,所以在除以另一个整数时不会自动得到小数结果。如果您不想投射,您应该一直在使用2.0. Java 中的整数除法总是丢弃小数,除非你另有说明。

于 2013-09-27T17:04:41.903 回答
0

如果结果有可能变成十进制数,例如在使用除法时,您应该始终确保结果是双精度数。必要时你会在这里施放。但一般来说,您在不同的上下文中更频繁地使用类型转换,例如从Object到其他东西,或者,作为一个更好的例子,在 Android 中从 aView到 a时。TextView

于 2013-09-27T17:06:00.547 回答