在Java中将double转换为String时的奇怪行为

时间:2012-04-27 13:28:34

标签: java android

我的Android应用程序崩溃来自SQL查询字符串构造中的奇怪行为。这是错误:

Caused by: android.database.sqlite.SQLiteException: near ")": syntax error: , while
compiling: SELECT [...], (0.6773931613745379*coslat*(coslng*0.9999276712889913
+sinlng*0.012027143*)+0.7356211694364222*sinlat) [...]

错误来自此处:sinlng*0.012027143*)< == *)最后

此字符串由以下函数构建:

public static String buildDistanceQuery(double latitude, double longitude) {
    final double coslat = Math.cos(MathUtils.deg2rad(latitude));
    final double sinlat = Math.sin(MathUtils.deg2rad(latitude));
    final double coslng = Math.cos(MathUtils.deg2rad(longitude));
    final double sinlng = Math.sin(MathUtils.deg2rad(longitude));
    return "(" + coslat + "*" + LocationColumns.COSLAT
            + "*(" + LocationColumns.COSLNG + "*" + coslng
            + "+" + LocationColumns.SINLNG + "*" + sinlng
            + ")+" + sinlat + "*" + LocationColumns.SINLAT 
            + ")";
}

正如您所看到的,LocationColumns.SINLNG + "*" + sinlng + ")"变为sinlng*0.012027143*)而我真的不知道这是怎么可能的,因为sinlng是双重的......

我无法重现问题,崩溃来自Android Market控制台,我没有所有上下文。这不是一个独特的崩溃,我有多次出现。

我可以尝试使用StringBuilder(),但我不确定它是否会纠正这个问题。

有人知道double在转换为String时如何生成“*”吗?

2 个答案:

答案 0 :(得分:2)

我不知道为什么,但是有一个缺失的“(”就在coslng之前,你能查一下吗?

编辑:感谢您修复它,有一种方法可以打印或检查字符串,检查*是否已经出现在那里,或者只是在构建查询之后?并且可能检查双sinlng是否匹配0.012027143。

不确定这会有什么帮助,但它是一个开始:)

答案 1 :(得分:0)

在我的APK中设置了一些报告后,我找到了问题的根源。

在中兴StarAddict上,结果如下:

final double sinlat = Math.sin(MathUtils.deg2rad(47.3572329));

0.0121*

我知道这没有意义,但这就是它的方式。我想这个设备确实存在缺陷,因为其他字符串正在被“翻译”:

final static String QUERY = "distance > ?";

变为

"distance > ?"

用于数据提供者。

我在Google上做了一些研究,但找不到具体的内容。

有关信息,我的应用程序在100K +设备上处于活动状态,只有ZTE StarAddict的行为类似。因此,我们可以在代码中排除错误。

如果有人遇到与我相同的问题,我会很高兴听到一些线索。