Как бороться с точной точностью в Java? - PullRequest
0 голосов
/ 22 декабря 2018

Требуется проверить, проходит ли конкретная точка, лежащая в 2D-плоскости, через определенную линию или нет.

2 заданных начальных точки: (3,1) и (12, 3).Наклон линии можно рассчитать как

(y2-y1) / (x2-x1)

. Затем уравнение линии можно построить с помощью y = mx + c, где m - наклон, а c - постоянная.Уравнение для представления линии выглядит так: 2x + 3 = 9y

Итак, чтобы проверить, проходит ли вышеуказанная линия через координату (-6, -1), мы просто проверяем 2x + 3 = 9y

2x + 3 = 2(-6) + 3 = -12 + 3 = -9 = 9(-1) -> true

Это легко, когда имеешь дело с ручкой и бумагой.

Однако точность в java теряется, когда наклон вычисляется как (3-1) / (12-3) = 2/9

При использовании Bigdecimal при расчете наклона выдается исключение

java.lang.ArithmeticException: не заканчивающееся десятичное расширение;нет точного представимого десятичного результата.

И с двойным

    double slope = (double)(3-1)/(double)(12-3);  //0.2222222222222222
    // Putting (3,1) to get c
    double c = (double)(1) - (double)(slope * 3); //0.33333333333333337
    Hence the equation of the line is y = 0.2222222222222222(x) + 0.33333333333333337

    // to check whether (-6, -1) passes through the above line, put the x coordinate 
    double yCoordinate = 0.2222222222222222* (-6) + 0.33333333333333337;

yCoordinate получается равным -0.9999999999999999, который не -1.Таким образом, результат неверен, но ответ, рассчитанный простой математикой, верен.Как я могу получить ожидаемый результат?

1 Ответ

0 голосов
/ 22 декабря 2018

Это достаточно близко, чтобы дать точное значение, но это не правильный путь

public double getExactValueDiv(double a,double b){
      double tmp = a/b;
      tmp=Math.round(tmp*1000000000)/1000000000
      return tmp;
}
...