如何处理Java中的精确度?

时间:2018-12-22 15:43:53

标签: java double precision bigdecimal

要求是检查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

这在处理笔和纸时很容易。

但是,当斜率计算为(3-1)/(12-3)= 2/9时,java的精度会丢失

使用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 :(得分:0)

这足够接近给出确切的值,但不是正确的方法

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