Java 10 NumberFormat 无法解析指数格式的双精度数

Java 10 NumberFormat fails to parse a double in exponential format

我最近从 Java 8 升级到 Java 10。我遇到了一个使用 Java 10 的失败测试,​​我不确定如何处理。我们有一些代码使用 java.text.NumberFormat.getInstance() 将双精度值的 String 表示解析为双精度值。在数值以指数形式写入的情况下,使用Java 10.

时解析的值不正确

这是我的 JUnit 测试:

@Test
public void testMe() throws ParseException {
    String input = "2.0E-4";
    double output = NumberFormat.getInstance().parse(input).doubleValue();
    System.out.println(output);
}

使用Java8时,double变量正确设置为0.0002:

使用Java10时,double值错误设置为2.0:

有谁知道这是否是 Java 方面的有意更改?


虽然 Double.valueOf() 似乎正确解析了它。

从 JDK9 开始,默认区域设置数据使用从 Unicode 联盟的通用区域设置数据存储库 (CLDR) 派生的数据。因此 Java 9 及更高版本中的某些语言环境发生了变化。请参阅 Java 9 and the corresponding JEP 252.

的发行说明

参考 CLDR 数字符号图表中的 exponential symbol,对于 en_AU,指数符号是 e(小写)而不是 E(大写)。因此,输出的差异。

String input = "2.0e-4";
double output = NumberFormat.getInstance().parse(input).doubleValue();
System.out.println(output);

将给出预期的输出:

java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
2.0E-4