我有一个XYSeries,它包含点和点的Lat和Lon位置。 在某些时候,我计算所有这些位置的中心点。 代码很简单:
for(int i = 0; i < pnts.getItemCount(); i++){
avgLon += (double)pnts.getX(i);
avgLat += (double)pnts.getY(i);
}
cntrMass = new Vector2D(avgLon/pnts.getItemCount(), avgLat/pnts.getItemCount());
然而,这个平均计算并不准确。
当我使用excel表和相同的数据集计算相同的东西时,中心点有差异。我正在使用两个计算的确切有效位数。
差异是1e-6量级,当转换为米时,它变得非常重要。
任何想法如何解决这个问题?任何帮助,将不胜感激。
答案 0 :(得分:0)
你正在使用双打。如果你将超精确数字转换为双精度,则会失去一些精确度。然后,如果你再用另一个数字再做一次然后使用那些已经舍入的数字进行一些计算,你将得到一个再次舍入的结果,因此更加不精确。
使用像BigDecimal这样的数据类型可以获得更精确的结果,但是你永远不会避免舍入错误。
Vector2D也使用双打来存储值,因此你会遇到同样的问题。
答案 1 :(得分:0)
以下是给出代码时如何使用BigDecimal的示例:
int itemCount = pnts.getItemCount();
int scale = 3;
BigDecimal itemCountBig = new BigDecimal(itemCount);
BigDecimal avgLonBig = BigDecimal.ZERO.setScale(scale, BigDecimal.ROUND_HALF_UP);
BigDecimal avgLatBig = BigDecimal.ZERO.setScale(scale, BigDecimal.ROUND_HALF_UP);
for(int i = 0; i < itemCount; i++){
avgLonBig = avgLonBig.add( new BigDecimal(String.valueOf((double)pnts.getX(i))));
avgLatBig = avgLatBig.add( new BigDecimal(String.valueOf((double)pnts.getY(i))));
}
cntrMass = new Vector2D(
avgLonBig.divide(itemCountBig, MathContext.DECIMAL128).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue(),
avgLatBig.divide(itemCountBig, MathContext.DECIMAL128).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue());
也许您可以尝试一下,看看它是否有助于解决您的精确问题。