Java中进行高精准度坐标数据计算使用BigDecimal(计算距离、开平方)
场景
Java中使用java.awt.geom.Point2D进行坐标相关的计算(距离、平方等):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126072919
Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126302894
上面讲的进行精度要求底的数据进行空间计算时,可以使用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; } }
博客园:
https://www.cnblogs.com/badaoliumangqizhi/
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。