【问题标题】:Double.parseDouble() returns Infinity when I thought it should be NumberFormatException当我认为它应该是 NumberFormatException 时,Double.parseDouble() 返回 Infinity
【发布时间】:2015-04-23 20:03:19
【问题描述】:

Double.parseDouble() 方法存在奇怪和意外的行为:

Double.parseDouble("4cff9d79-a696-4dfc-89f9-a265ae117257");

这并没有像预期的那样抛出NumberFormatException。结果是Infinity。使用其他 UUID 会引发异常。问题仅出在 Android Java 上,在桌面版本中它可以正常工作。为什么?

PS:使用了 Android API 17,Android 4.4.2 手机上出现异常。

【问题讨论】:

  • 是的。我已阅读 Q&A style 统治者页面并确定它是方法。
  • donot滥用代码formatting
  • 对不起,我被解雇了

标签: java android


【解决方案1】:

Double.parseDouble()代码:

if (result.e < -1024) {
    result.zero = true;
    return result;
} else if (result.e > 1024) {
    result.infinity = true;
    return result;
}

Double 具有指数视图MeP,其中M - mantissaP - exponentMeP 等于M*10^P)。 Android首先检查指数是否存在,如果是&gt; 1024,则判断为Infinity并停止任何其他验证。

在这段代码中我们可以看到,如果e后面的字母是任何小于1024的负数,这个数字被认为是正确的但等于zero

Double.parseDouble("Any characterse1025"); //Infinity
Double.parseDouble("Any characterse-1025"); //0.0

我们的案例是UUIDs:

Double.parseDouble("4cff9d79-a696-4dfc-89f9-a265ae117257"); //Infinity
Double.parseDouble("4cff9d79-a696-4dfc-89fe-126534117257"); //0.0

所以,使用这种方法是不安全的。寻找替代品。

UPD: Original investigation page (ru)。翻译不是为了费率。

UPD2:错误是already fixed

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多