High-precision coordinate data calculation in Java uses BigDecimal (calculation distance, square root)

Scenes

Use java.awt.geom.Point2D in Java for coordinate-related calculations (distance, square, etc.):

Use java.awt.geom.Point2D in Java for coordinate-related calculations (distance, square, etc.)

Use JTS in Java to calculate spatial geometry (read WKT, distance, point in plane, length, area, intersection, etc.):

Use JTS in Java to calculate spatial geometry (read WKT, distance, point in plane, length, area, intersection, etc.)

When performing spatial calculations on data with low precision requirements as mentioned above, Double can be used for assignment.

If the precision of the coordinate data is relatively high, such as 8 digits after the decimal point, etc., you need to use BigDecimal for assignment and calculation.

Note:

Blog:
https://blog.csdn.net/badao_liumang_qizhi 

accomplish

Use BigDecimal to calculate distance with specified precision, for example, specify to 5 digits after the decimal point.

    /**
     * 使用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;
    }

Among them, the square root method is used

    /**
     * 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;
        }
    }

Supongo que te gusta

Origin blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130480786
Recomendado
Clasificación