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

时间:2018-06-28 22:40:17

标签: java java-10

我最近已从Java 8升级到Java10。我在使用Java 10时遇到了失败的测试,我不确定该如何处理。我们有一些代码使用String将双值的java.text.NumberFormat.getInstance()表示解析为双值。如果以指数形式写入值,则使用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);
}

使用Java 8时,将double变量正确设置为0.0002:

Screenshot of Java 8 run

使用Java 10时,双精度值错误地设置为2.0:

Screenshot of Java 10 run

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


不过,看来Double.valueOf()可以正确解析它。

1 个答案:

答案 0 :(得分:1)

从JDK 9开始,默认语言环境数据使用从Unicode联盟的公共语言环境数据存储库(CLDR)派生的数据。因此,在Java 9和更高版本中,某些语言环境有所变化。请参阅Java 9和相应的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