没有小数位的Java double没有正确乘法?

时间:2014-05-08 21:13:14

标签: java math

我很遗憾地问这个问题但是我现在完全失去了对Java数学的思考以及它的众多怪癖。我有一个从地理经度/纬度转换为相对X / Y图的函数。 (不重要)但是在测试过程中我遇到了一个问题,即双倍乘法会产生一个没有小数位的双精度(例如100.0),它会返回一个不正确的值。

这是我最近的尝试:

double DEGREE_DISTANCE_AT_EQUATOR = 111329;
double E6 = Double.valueOf(1E6);

double lng1 = 44.34648;
double lat1 = -76.888694;
double lng2 = 44.346356;
double lat2 = -76.888215;

xyFromLongLat(lng1, lat1, lng2, lat2);


public static Pair<Double, Double> xyFromLongLat(double long0, double lat0, double long1, double lat1) {
    double x = Math.round(((long1 - long0) * longitudeDistanceAtLatitude(lat0)) * E6);
    double y = Math.round(((lat1 - lat0) * DEGREE_DISTANCE_AT_EQUATOR) * E6);
    return new Pair<Double, Double>(x, y);
}

Double y导致5.3326591E7?例如(-76.888694 - -76.888215)= -0.000479 * 111329.0 = -53.326591 * 1000000.0应该等于-53326591。

相反,它等于:5.332659099984012E7

(lat1 - lat0) * DEGREE_DISTANCE_AT_EQUATOR
(-76.888694 - -76.888215) * 111329.0 = -53.326591 <- This is correct

((lat1 - lat0) * DEGREE_DISTANCE_AT_EQUATOR) * E6
((-76.888694 - -76.888215) * 111329.0) * 1000000.0 = 5.332659099984012E7 <- What is this?!

我不知道为什么这是一个问题。在某些时候,可能会有一些自动转换为long或float,因为结果没有小数位但是应该是double?

如果这是一个明显的问题,我真的很抱歉。任何建议都非常受欢迎,因为任何编辑都澄清了我滥用的任何术语。谢谢!

请注意,我意识到Math.round会返回一个长整数。这是最新的尝试,没有舍入Y产生相同的错误值。

1 个答案:

答案 0 :(得分:1)

这是科学记数法,意味着5.3326乘以10 7

所以E在这里代表10,然后是10的指数。