浮点计算保持返回0.0

时间:2013-08-11 10:37:12

标签: java debugging math methods

我正在编写一种方法来返回2点之间的点数列表。不管怎样,无论startPoint和endPoint位置如何,斜率(y2-y1)/(x2-x1)始终给我0.0。 这是方法:

public ArrayList<Point> calculatePath(Point startPoint, Point endPoint) {
        ArrayList<Point> calculatedPath = new ArrayList<>();
        int x1 = startPoint.x;
        int y1 = startPoint.y;
        int x2 = endPoint.x;
        int y2 = endPoint.y;
        System.out.println("Run");
        if ((x2 - x1) != 0) {
            float ratio = ((y2 - y1) / (x2 - x1));
            System.out.println(ratio);
            int width = x2 - x1;
            for (int i = 0; i < width; i++) {
                int x = Math.round(x1 + i);
                int y = Math.round(y1 + (ratio * i));
                calculatedPath.add(new Point(x, y));
            }
        } else {

            if (y1 < y2) {
                while (y1 == y2) {
                    calculatedPath.add(new Point(x1, y1));
                    y1++;
                }
            } else {
                while (y1 == y2) {
                    calculatedPath.add(new Point(x1, y1));
                    y1--;
                }
            }

        }

        return calculatedPath;
    }

有谁可以指出我做错了什么?感谢

3 个答案:

答案 0 :(得分:5)

尝试将你的整数投射到花车中

在你的caluclation过程中,你需要将至少一个元素转换为float:

float ratio = ((float)(y2 - y1) / (float)(x2 - x1));

那是因为:

float a = integer / integer
          ^^^^^^^^^^^^^^^^^ - The result will be an integer.
                              Therefore u need to cast at least one of the
                              to float

这个例子很容易显示:

public static void main(String[] args)
{
    float resultWithoutCast = 5 / 3;
    float resultWithCast = (float)5 /3 ;

    System.out.println(resultWithoutCast);
    System.out.println(resultWithCast);
}

会打印

  • 1.0
  • 1.6666666

答案 1 :(得分:3)

你忘了在分裂期间施放你的int。尝试这样的事情: -

float ratio = ((float)(y2 - y1) / (x2 - x1));

答案 2 :(得分:2)

执行算术时,您需要确保使用允许预期结果的类型。例如,您的代码的问题是您正在寻找浮点结果但使用int - 这里的问题是int只会截断任何浮点。

有几种方法可以解决这个问题 - 正如已经建议你可以使用强制转换

float ratio = ((float)(y2 - y1) / (x2 - x1));

或者您可以使用float个变量,它会产生更易读的代码,例如

float x1 = (float)startPoint.X;
float y1 = (float)startPoint.Y;
...
float ratio = (y2 - y1) / (x2 - x1);

然而,这导致更多的铸造。

或者,您可以将Point替换为PointF并完全取消投射。