Java中进行高精准度坐标数据计算使用BigDecimal(计算距离、开平方)

场景

Java中使用java.awt.geom.Point2D进行坐标相关的计算(距离、平方等):

Java中使用java.awt.geom.Point2D进行坐标相关的计算(距离、平方等)_point2d.double_霸道流氓气质的博客-CSDN博客

Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等):

Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等)_java 点在面内_霸道流氓气质的博客-CSDN博客

上面讲的进行精度要求底的数据进行空间计算时,可以使用Double进行赋值。

如果坐标数据精度比较高,比如到小数点后8位等,则需要使用BigDecimal进行赋值和计算。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi 

实现

使用BigDecimal进行指定精度计算距离,比如指定到小数点后5位。

    /**
     * 使用BigDecimal 指定精确度计算距离
     * @param p1x 第一个点的x
     * @param p2x 第二个点的x
     * @param p1y 第一个点的y
     * @param p2y 第二个点的y
     * @return
     */
    public BigDecimal getDistanceByBigDecimal(double p1x, double p2x, double p1y, double p2y){
        BigDecimal p1xB = new BigDecimal(p1x);
        BigDecimal p2xB = new BigDecimal(p2x);
        BigDecimal p1yB = new BigDecimal(p1y);
        BigDecimal p2yB = new BigDecimal(p2y);
        BigDecimal bigDecimal = (p1xB.subtract(p2xB)).multiply(p1xB.subtract(p2xB)).add((p1yB.subtract(p2yB)).multiply(p1yB.subtract(p2yB)));
        BigDecimal distance = sqrt(bigDecimal,5);
        return distance;
    }

其中又用到开平方的方法

    /**
     * BigDecimal 开平方
     * @param value 要开平方的值
     * @param scale 精确度
     * @return
     */
    public BigDecimal sqrt(BigDecimal value, int scale){
        if(value.compareTo(new BigDecimal(0)) == 0){
            return new BigDecimal(0);
        }else {
            BigDecimal num2 = BigDecimal.valueOf(2);
            int precision = 100;
            MathContext mc = new MathContext(precision, RoundingMode.HALF_UP);
            BigDecimal deviation = value;
            int cnt = 0;
            while (cnt < precision) {
                deviation = (deviation.add(value.divide(deviation, mc))).divide(num2, mc);
                cnt++;
            }
            deviation = deviation.setScale(scale, BigDecimal.ROUND_HALF_UP);
            return deviation;
        }
    }

猜你喜欢

转载自blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130480786